简析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语言学习笔记、语法知识、技术要点和个人理解及实战