这个问题在这里已有答案:
在Go中,我阅读文档并了解make
和new
之间的基本差异
我阅读文档,主要是使用数组的示例。我在创建数组时理解new
与make
。但是在创建频道时我不明白差异:
c1 := new(chan string)
c2 := make(chan string)
除了c1具有类型(chan *)和c2具有类型chan之外,真正的差异是什么。
谢谢
在new
解释了Allocation with new
的行为。
它是一个内置函数,可以分配内存,但与其他语言中的名称不同,它不会初始化内存,它只会将内存归零。
在这种情况下,new(chan string)
返回一个指向类型为chan string
的零值的指针,这是零通道。以下程序在尝试从nil通道读取时死锁。
package main
import (
"fmt"
)
func main() {
c1 := new(chan string)
fmt.Println(*c1)
go func() {
*c1 <- "s"
}()
fmt.Println(<-*c1)
}
使用make(chan string)
,您可以获得实际可用的通道,而不是通道类型的零值。
package main
import (
"fmt"
)
func main() {
c2 := make(chan string)
fmt.Println(c2)
go func() {
c2 <- "s"
}()
fmt.Println(<-c2)
}