代码之家  ›  专栏  ›  技术社区  ›  Trần Kim Dá»±

创建频道时新建vs make[复制]

  •  -1
  • Trần Kim Dá»±  · 技术社区  · 7 年前

    在Go中,我阅读了文档并理解了 make new

    • 新建:返回指针(*T)及其指向的值为零
    • 品牌:返回类型T

    我阅读了文档,主要是使用数组的示例。我理解 vs公司 制作 创建阵列时。但我不理解创建频道时的区别:

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

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

    谢谢

    1 回复  |  直到 7 年前
        1
  •  5
  •   dtolnay    7 年前

    的行为 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)
    }