英文:
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"
}
英文:
The following code works okay
func main() {
c := make(chan string)
go subRountine(c)
fmt.Println(<-c)
}
func subRountine(c chan string) {
c <- "hello"
}
Is there any other method to create a channel without the make function?
Something like this but this sample does not work
func main() {
var c chan string
go subRountine(c)
fmt.Println(<-c)
}
func subRountine(c chan string) {
c <- "hello"
}
答案1
得分: 3
TL;DR
没有绕过的方法:你必须使用make
函数。
更多细节
var c chan string
仅仅声明了一个通道变量,但没有初始化通道!这是有问题的,因为,正如语言规范所述
> 未初始化的通道的值是nil
。
并且
> nil
通道永远不会准备好进行通信。
换句话说,向一个nil
通道发送和/或接收操作是阻塞的。虽然nil
通道值_可以_有用,但如果你想在通道上执行_通道通信_(发送或接收),你必须在某个阶段初始化通道。
正如mkopriva在他的评论中所写的,Go只提供了一种初始化通道的方法:
> 可以使用内置函数make
来创建一个新的、初始化的通道值,该函数接受通道类型和一个可选的_容量_作为参数:
>
> make(chan int, 100)
英文:
TL;DR
No way around it: you must use make
.
More details
var c chan string
merely declares a channel variable, but without initialising the channel! This is problematic because, as the language spec puts it
> The value of an uninitialized channel is nil
.
and
> A nil
channel is never ready for communication.
In other words, sending and/or receiving to a nil
channel is blocking. Although nil
channel values can be useful, you must initialise a channel at some stage if you ever want to perform channel communications (send or receive) on it.
As mkopriva writes in his comment, Go provides only one way of initialising a channel:
> 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)
答案2
得分: 1
不!使用var
声明一个通道与创建一个通道是不同的。你应该使用make
来创建通道:
var c chan string
c = make(chan string)
不同之处在于现在你可以在底层作用域中创建c并在其外部使用。
请注意,你不应该在等号前面加上冒号。
英文:
No! Declaring a channel with var
is different from creating it. Then you should create by make
:
var c chan string
c = make(chan string)
With the difference that now you can make c in underlying scops and use it outside of them.
<i>Note that you shouldn't put colons before the equals sign in this way.</i>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论