创建频道时的新vs制作

时间:2018-03-01 17:59:50

标签: go channel

在Go中,我阅读了文档并了解makenew

之间的基本差异
  • new:返回一个指针(* T),它指向
  • 的零值
  • make:返回类型T

我阅读文档,主要是使用数组的示例。创建数组时,我了解new vs make。但是在创建频道时我不明白差异:

c1 := new(chan string)
c2 := make(chan string)

除了c1具有类型(chan *)和c2具有类型chan

之外,真正的差异是什么

由于

1 个答案:

答案 0 :(得分:5)

new中解释了new(chan string)的行为。

  

这是一个内置函数,可以分配内存,但与其他语言中的名称不同,它不会初始化内存,只有它。

在这种情况下,chan string返回指向类型为package main import ( "fmt" ) func main() { c1 := new(chan string) fmt.Println(*c1) go func() { *c1 <- "s" }() fmt.Println(<-*c1) } 的零值的指针,这是零通道。以下程序在尝试从nil通道读取时死锁。

make(chan string)

使用package main import ( "fmt" ) func main() { c2 := make(chan string) fmt.Println(c2) go func() { c2 <- "s" }() fmt.Println(<-c2) } ,您将获得实际可用的频道,而不是频道类型的零值。

./bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic my-topic --partitions 20