素数筛的实现中,chan作为参数的时候加了 赋值方向的符号(<- ,->),但是我去掉了运行效果是一样的,加这个符号主要是什么作用呢?

ximen · 2017-08-30 07:01:28 · 1319 次点击

好像是这个意思

var ch chan int

var ch1 chan<- int //ch1只能写

var ch2 <-chan int //ch2只能读

#2
更多评论

为了接收方往 chan 写值或发送方从 chann 接收,相当于限制了方向。

#1

你这里没有区分发送和接收

package main

import (
    "fmt"
    "sync"
)

// 通道默认是双向的, 不区分发送和接收端
// 某些时候我们可以限制手发操作的方向
// 尽管可以用make创建单向通道, 没有任何意义
// 通常使用类型转换来获取单向通道, 并分别赋予操作双方
func main() {
    var wg sync.WaitGroup
    wg.Add(2)

    c := make(chan int)
    var send chan <- int = c
    var recv <- chan int = c

    go func() {
        defer wg.Done()
        for x := range recv {
            fmt.Println(x)
        }
    }()

    go func() {
        defer wg.Done()
        defer close(c)
        for i := 0; i < 100; i ++ {
            send <- i
        }
    }()

    wg.Wait()
}
#3