golang中单向channel有啥用处

我知道单向channel是怕渠道滥用, 只能读的渠道出现写的情况, 但是具体的用法呢
比如time包里面的Timer
屏幕快照 2019-09-12 下午3.50.04
clipboard.png

这边将C 已经定义为了, 只出的类型, 那么是怎么赋值的呢, 找了下貌似没找到

阅读 5.9k
7 个回答

总结一下:

  1. 首先 渠道是引用传递的, 这个函数里关于参数渠道的修改, 都直接回修改原来的值
  2. 双向渠道 是可以赋值给单向渠道的, 自动转换的, 举个例子

a := make(chan int, 3)
a <- 1 // 塞了一个数据

//往渠道里塞2,3 两个数字
func test2(b chan<- int) {

b <- 2
b <- 3
close(b)

}

fmt.Println(a)
得到的结果是1,2,3

虽然 C 是 <-chan Time 类型,但你依然可以赋给它一个 chan Time,写的话,就用这个 chan Time 就行了

给你看看官方怎么赋值的:

func NewTicker(d Duration) *Ticker {
    if d <= 0 {
        panic(errors.New("non-positive interval for NewTicker"))
    }
    // Give the channel a 1-element time buffer.
    // If the client falls behind while reading, we drop ticks
    // on the floor until the client catches up.
    c := make(chan Time, 1)
    t := &Ticker{
        C: c,
        r: runtimeTimer{
            when:   when(d),
            period: int64(d),
            f:      sendTime,
            arg:    c,
        },
    }
    startTimer(&t.r)
    return t
}
新手上路,请多包涵

非常好的问题,我也正向问这个问题呢

楼上说的对,我在白话一些:

  1. 形参要求 只读通道,但是我们可传入双向通道,只是在这个函数中只读
  2. 在其他逻辑(这个函数)之外,进行 send 操作

官方对 Channel 类型的解释 里面讲到了 只读/只写 通道,不过没有介绍具体的应用场景。不过从特性来看,如果把一个变量定义为只读的channel,那么在这个函数里面只能读这个变量,如果尝试写这个变量编译器会报错,从而可以避免编码出错。

定义时候可以定义为双向通道,函数引用的时传入单向通道,增加代码可读性

func receive(strChan <-chan string){
//...
}

这种引用通道的方式,让人一看就知道只会从strChan中取数据

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏