golang中单向channel有啥用处

发布于 2022-09-11 22:23:20 字数 232 浏览 15 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

梅倚清风 2022-09-18 22:23:20

总结一下:

  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

毁我热情 2022-09-18 22:23:20

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

爱殇璃 2022-09-18 22:23:20

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

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
}
小姐丶请自重 2022-09-18 22:23:20

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

美煞众生 2022-09-18 22:23:20

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

  1. 形参要求 只读通道,但是我们可传入双向通道,只是在这个函数中只读
  2. 在其他逻辑(这个函数)之外,进行 send 操作
风启觞 2022-09-18 22:23:20

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

可爱咩 2022-09-18 22:23:20

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文