我可以不使用 make 函数创建频道吗?
Can I create channel without using the make function?
下面的代码可以正常工作
func main() {
c := make(chan string)
go subRountine(c)
fmt.Println(<-c)
}
func subRountine(c chan string) {
c <- "hello"
}
有没有没有make函数的其他创建频道的方法?
类似这样,但此示例不起作用
func main() {
var c chan string
go subRountine(c)
fmt.Println(<-c)
}
func subRountine(c chan string) {
c <- "hello"
}
没有!使用 var
声明频道与创建频道不同。那么你应该通过 make
:
创建
var c chan string
c = make(chan string)
不同的是,现在您可以在底层作用域中创建 c 并在它们之外使用它。
请注意,这种方式不应该在等号前加上冒号。
TL;DR
没办法:你必须使用 make
.
更多详情
var c chan string
仅仅声明了一个通道变量,没有初始化通道!这是有问题的,因为 as the language spec puts it
The value of an uninitialized channel is nil
.
和
A nil
channel is never ready for communication.
换句话说,发送 and/or 接收到 nil
通道是阻塞的。虽然 nil
channel values can be useful,但如果您想在其上执行 频道通信 (发送或接收),则必须在某个阶段初始化频道。
正如 mkopriva 在 中所写,Go 仅提供一种初始化通道的方法:
A new, initialized channel value can be made using the built-in function make
, which takes the channel type and an optional capacity as arguments:
make(chan int, 100)
下面的代码可以正常工作
func main() {
c := make(chan string)
go subRountine(c)
fmt.Println(<-c)
}
func subRountine(c chan string) {
c <- "hello"
}
有没有没有make函数的其他创建频道的方法? 类似这样,但此示例不起作用
func main() {
var c chan string
go subRountine(c)
fmt.Println(<-c)
}
func subRountine(c chan string) {
c <- "hello"
}
没有!使用 var
声明频道与创建频道不同。那么你应该通过 make
:
var c chan string
c = make(chan string)
不同的是,现在您可以在底层作用域中创建 c 并在它们之外使用它。
请注意,这种方式不应该在等号前加上冒号。
TL;DR
没办法:你必须使用 make
.
更多详情
var c chan string
仅仅声明了一个通道变量,没有初始化通道!这是有问题的,因为 as the language spec puts it
The value of an uninitialized channel is
nil
.
和
A
nil
channel is never ready for communication.
换句话说,发送 and/or 接收到 nil
通道是阻塞的。虽然 nil
channel values can be useful,但如果您想在其上执行 频道通信 (发送或接收),则必须在某个阶段初始化频道。
正如 mkopriva 在
A new, initialized channel value can be made using the built-in function
make
, which takes the channel type and an optional capacity as arguments:make(chan int, 100)