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)
    }
}