创建频道时的新vs制作

Trầ*_* Dự -1 channel go

在Go中,我阅读文档并理解make和之间的基本差异new

  • new:返回一个指针(*T)和它指向的零值
  • make:返回类型T.

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

c1 := new(chan string)
c2 := make(chan string)
Run Code Online (Sandbox Code Playgroud)

除了c1具有类型(chan*)和c2具有类型chan之外,真正的差异是什么.

谢谢

dto*_*nay 5

newAllocation 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)
}
Run Code Online (Sandbox Code Playgroud)

随着make(chan string)您获得实际可用的通道,而不是通道类型的零值.

package main

import (
    "fmt"
)

func main() {
    c2 := make(chan string)
    fmt.Println(c2)
    go func() {
        c2 <- "s"
    }()
    fmt.Println(<-c2)
}
Run Code Online (Sandbox Code Playgroud)