Go 如何使用<-chan和chan<;-用于单向通信?
我正在努力了解围棋的频道。我想我理解一个基本的双向Go 如何使用<-chan和chan<;-用于单向通信?,go,channel,Go,Channel,我正在努力了解围棋的频道。我想我理解一个基本的双向chan,但我不理解您的线程函数正在传递一个只发送的通道,而不是只接收的通道。但是您不需要make()it receive only,您可以将双向通道作为receive only传递给goroutine package main import ( "fmt" "time" ) func Thread(c <-chan int) { for { num := <-c fmt.P
chan
,但我不理解您的线程
函数正在传递一个只发送的通道,而不是只接收的通道。但是您不需要make()
it receive only,您可以将双向通道作为receive only传递给goroutine
package main
import (
"fmt"
"time"
)
func Thread(c <-chan int) {
for {
num := <-c
fmt.Println("Thread : ", num)
time.Sleep(time.Second)
}
}
func main() {
c := make(chan int, 3)
go Thread(c)
for i := 1; i <= 10; i++ {
c <- i
}
for len(c) > 0 {
time.Sleep(100)
}
}
主程序包
进口(
“fmt”
“时间”
)
func线程(c
通道提供了一种机制,用于并发执行
通过发送和接收指定元素的值进行通信
类型。未初始化通道的值为零
ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
ChannelType=(“chan”|“chan”Go允许创建只发送或只接收的通道,如c:=make(我喜欢这种工作方式。这让我想知道为什么编译器会允许我直接创建一个单向chan。@CoreyOgburn:请看我修改后的答案。需要记住的一点是,在通过无缓冲通道进行的特定数据交换中,始终有一端是编写器,另一端是阅读器。如果你要尝试编写client/服务器通信,在同一通道(即真正的双向通道)上,先向一个方向发送请求,然后向另一个方向发送响应,当其他客户端尝试加入时,您可能会遇到死锁。因此,在实践中,最好将通道视为单向的,即使在规范中它们被松散地描述为双向的。当它们被缓冲时,它们可以以更复杂的方式运行,但作为一个起点,我始终认为无缓冲通道是不可用的IDirection only.@peterSO对如何将通道端传递到func线程(r
package main
import (
"fmt"
"time"
)
func Thread(c <-chan int) {
for {
num := <-c
fmt.Println("Thread : ", num)
time.Sleep(time.Second)
}
}
func main() {
c := make(chan int, 3)
go Thread(c)
for i := 1; i <= 10; i++ {
c <- i
}
for len(c) > 0 {
time.Sleep(100)
}
}
c <- 3
ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
package main
import (
"fmt"
"time"
)
func Thread(r <-chan int) {
for {
num := <-r
fmt.Println("Thread : ", num)
time.Sleep(time.Second)
}
}
func main() {
c := make(chan int, 3)
s, r := (chan<- int)(c), (<-chan int)(c)
go Thread(r)
for i := 1; i <= 10; i++ {
s <- i
}
for len(c) > 0 {
time.Sleep(100)
}
}
Thread : 1
Thread : 2
Thread : 3
. . .
package main
import (
"fmt"
"time"
)
func Thread(r <-chan int) {
for {
num := <-r
fmt.Println("Thread : ", num)
time.Sleep(time.Second)
}
}
func main() {
c := make(chan int, 3)
var s chan<- int = c
var r <-chan int = c
go Thread(r)
for i := 1; i <= 10; i++ {
s <- i
}
for len(c) > 0 {
time.Sleep(100)
}
}
func Thread(c chan<- int) {
for {
num := <-c
fmt.Println("Thread : ", num)
time.Sleep(time.Second)
}
}
package main
import (
"fmt"
"time"
)
func Thread(c <-chan int) {
for {
num := <-c
fmt.Println("Thread : ", num)
time.Sleep(time.Second)
}
}
func main() {
c := make(chan int, 3)
go Thread(c)
for i := 1; i <= 10; i++ {
c <- i
}
for len(c) > 0 {
time.Sleep(100)
}
}