创建频道时的新vs制作[复制]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

在Go中,我阅读文档并了解makenew之间的基本差异

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

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

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

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

谢谢

go channel
1个回答
5
投票

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.