Go 创建频道时的新vs make
在围棋中,我阅读了文档并理解了Go 创建频道时的新vs make,go,channel,Go,Channel,在围棋中,我阅读了文档并理解了make和new 新建:返回指针(*T)并将其指向的值置零 制造商:返回类型T 我阅读了文档,主要是使用数组的示例。创建数组时,我了解newvsmake。但我不理解创建频道时的区别: c1 := new(chan string) c2 := make(chan string) 除了c1有类型(chan*)和c2有类型chan之外,真正的区别是什么 感谢中解释了new的行为 它是一个分配内存的内置函数,但与其他一些语言中的同名函数不同,它不初始化内存,只将内存归
make
和new
- 新建:返回指针(*T)并将其指向的值置零
- 制造商:返回类型T
new
vsmake
。但我不理解创建频道时的区别:
c1 := new(chan string)
c2 := make(chan string)
除了c1有类型(chan*)和c2有类型chan之外,真正的区别是什么
感谢中解释了
new
的行为
它是一个分配内存的内置函数,但与其他一些语言中的同名函数不同,它不初始化内存,只将内存归零
在这种情况下,new(chan-string)
返回一个指向类型为chan-string
的零值的指针,该零值是nil通道。以下程序在尝试从nil通道读取时发生死锁
package main
import (
"fmt"
)
func main() {
c1 := new(chan string)
fmt.Println(*c1)
go func() {
*c1 <- "s"
}()
fmt.Println(<-*c1)
}
@Flimzy我以前搜索过那个帖子,但我无法将这个概念映射到“频道”。所以我问了这个问题。这个问题直接而明确地解决了渠道问题。如果你没有“映射”这个概念,那就意味着你没有阅读答案。
package main
import (
"fmt"
)
func main() {
c2 := make(chan string)
fmt.Println(c2)
go func() {
c2 <- "s"
}()
fmt.Println(<-c2)
}