Go基础知识巩固二

简介: Go基础知识巩固二
  1. make和new的区别:都是用来初始化的
    new多用来为基本数据类型初始化内存,返回的是指针
    make用来初始化slince,map,channel,返回的是对应的类型
  2. 无缓冲通道和有缓冲通道区别:无缓冲通道传值得时候必须要有接收方来接收通道,否则报错;有缓冲通道可以直接传值
  3. 退出并发的三种方式
    利用全局变量来退出:定义exit来退出
var wg sync.WaitGroup
var exit bool
func worker() {
  for {
    fmt.Println("worker")
    time.Sleep(time.Second)
    if exit {
      break
    }
  }
  wg.Done()
}


利用通道channel+标签来退出 一般用结构体来定义通道,内存占用小:

func worker(exitChan chan struct{}) {
LOOP:
  for {
    fmt.Println("worker")
    time.Sleep(time.Second)
    select {
    case <-exitChan: // 等待接收上级通知
      break LOOP
    default:
    }
  }
  wg.Done()
}


官方context解法 在底层和使用通道没什么区别

var wg sync.WaitGroup
func worker(ctx context.Context) {
  defer wg.Done()
hello:
  for {
    fmt.Println("wuhu")
    time.Sleep(time.Second)
    select {
    case <-ctx.Done():
      break hello
    default:
    }
  }
}
func main() {
  ctx, cancel := context.WithCancel(context.Background())
  wg.Add(1)
  go worker(ctx)
  time.Sleep(time.Second * 3)
  cancel()
  wg.Wait()
  fmt.Println("over")

不同于上面两种的是:context可以同时退出多个并发程序,退出一个进程中子子孙孙的进程。

相关文章
|
12月前
|
Go C语言
GO基础知识分享2
GO基础知识分享2
|
小程序 Java Go
100天精通Golang(基础入门篇)——第14天:深入解析Go语言函数->从概念到实践,助您精通基础知识!(基础)
100天精通Golang(基础入门篇)——第14天:深入解析Go语言函数->从概念到实践,助您精通基础知识!(基础)
68 0
|
存储 算法 Java
Go入门篇:(二)基础知识之结构,包,变量初探
Go入门篇:(二)基础知识之结构,包,变量初探
76 0
|
Go C语言 Cloud Native
GO基础知识分享2 | GO主题月
[TOC] 兵长:胖sir,咋还在看基础知识嘞?你以前可不是这样的哦 胖sir:切,我今天看的和之前的可不一样 兵长:有啥不一样的,你能给我说出花来嘛 胖sir:小样,你自己好好看看 兵长:看看就看看
105 0
|
安全 编译器 Serverless
GO基础知识分享 | GO主题月
兵长:哟,最近在干啥呢 胖sir:在看我之前的go基础学习资料呢,回顾一下 兵长:那给我分享一下呗,我也想回顾回顾 胖sir:用你的小手指点开你的手机,我来传给你 兵长:你信不信我的小手指可以带你飞整个峡谷 . . .
|
算法 Go 调度
Go 语言入门很简单 -- 15. Go 并发基础知识 #私藏项目实操分享#
Go 语言入门很简单 -- 15. Go 并发基础知识 #私藏项目实操分享#
108 0
Go 语言入门很简单 -- 15. Go 并发基础知识 #私藏项目实操分享#
|
Go
2.go基础知识
内置关键字(25个,均为小写) break default func interface select case defer go map struct chan else goto package switch const fall...
905 0
|
3天前
|
Ubuntu 编译器 Linux
go语言中SQLite3驱动安装
【11月更文挑战第2天】
19 7
下一篇
无影云桌面