简析go语言空结构体类型channel

channel用于goroutine之间的通信和同步,创建channel一般使用make(chan T)的方式,有时会看到类似c := make(chan struct{})这种定义方式。即c为空结构体类型的channel变量。

空结构体的宽度为0,占用0字节内存空间。

func main() {
	s := struct{}{}
	fmt.Println(unsafe.Sizeof(s))  // 0
}

故空结构体类型channel不占用内存空间,比较省内存,是对内存友好的开发方式,避免了滥用内存。空结构体类型channel一般不需要往channel里写数据(可以写,只能写空结构体类型。c <- struct{}{}),只有读等待(即<-c)。如果没有往空结构体类型channel中写数据,可通过close()函数进行关闭,关闭后读等待返回。

var c chan struct{} = make(chan struct{})

func spawn() {
	go func() {
		fmt.Println("This is in test goroutine")
		close(c)  // 关闭channel
		fmt.Println("channel has been closed in test goroutine")
	}()
}

func main() {
	fmt.Println("This is in main goroutine")
	spawn()
	<-c  // main goroutine阻塞在channel上等待
	fmt.Println("main goroutine over")
}

$ go run empty-struct-channel-demo.go
This is in main goroutine
This is in test goroutine
channel has been closed in test goroutine  // 说明channel是在goroutine执行完毕后返回的
main goroutine over

上例中main goroutine和通过引用spawn创建的goroutine之间通过channel实现通信。main goroutine阻塞在channel上等待,spawn中创建的goroutine关闭channel后main goroutine中读等待返回,打印”main goroutine over“。

Go语言基础及实战 文章被收录于专栏

Go语言学习笔记、语法知识、技术要点和个人理解及实战

全部评论
老哥你从事go几年了?
点赞 回复 分享
发布于 2023-04-13 09:36 四川
go语言容易学不,之前领导有说让学go😆
点赞 回复 分享
发布于 2023-04-13 09:39 广东

相关推荐

学不完不睡觉11:一眼点评,不过,看运气吧
点赞 评论 收藏
分享
剑桥断刀:找啥工作,牛客找个比如大厂软开或者随便啥的高薪牛马,大把没碰过妹子的技术仔,狠狠拿捏爆金币
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务