• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang 函数返回chan类型的操作

    在阅读kafka的golang 客户端代码sarama-cluster时,遇到了如下一段代码:

    // Messages returns the read channel for the messages that are returned by
    // the broker.
    //
    // This channel will only return if Config.Group.Mode option is set to
    // ConsumerModeMultiplex (default).
    func (c *Consumer) Messages() -chan *sarama.ConsumerMessage { return c.messages }
    

    对于代码中的-chan *sarama.ConsumerMessage产生了疑问,这个是什么意思呢?

    经查阅资料,得知上面返回的是一个read-only类型的channel,即只读的管道。

    验证:

    package main
    import (
        "fmt"
    )
    type C struct {
        Name string
    }
    type D struct {
        Id chan C
    }
    func (d *D)A() chan C {
        return d.Id
    }
    func main() {
        c := C{
            Name: "test",
        }
        ch := make(chan C, 10)
        ch - c
        d := D{
            Id: ch,
        }
        r := d.A()
        r - c
        for i:=0;i=len(r);i++ {
            fmt.Printf("%v", -r)
        }
    }
    

    创建func A() chan C {}, 在调用A()后,返回值r为channel, 其仍可以写入对象c,输出结果为:

    {test}{test}
    Process finished with exit code 0
    package main
    import (
        "fmt"
    )
    type C struct {
        Name string
    }
    type D struct {
        Id chan C
    }
    func (d *D)A() -chan C {
        return d.Id
    }
    func main() {
        c := C{
            Name: "test",
        }
        ch := make(chan C, 10)
        ch - c
        d := D{
            Id: ch,
        }
        r := d.A()
        r - c
        for i:=0;i=len(r);i++ {
            fmt.Printf("%v", -r)
        }
    }
    

    创建func A() -chan C {}, 在调用A()后,返回值r为channel, 但无法向r中写入对象c,会报语法错误,输出结果为:

    # command-line-arguments
    .\test2.go:29:7: invalid operation: r - c (send to receive-only type -chan C)
    Compilation finished with exit code 2
    

    同理, 如果返回类型为 chan- type,则返回的是write-only类型的channel,即只能写不能读。

    如何声明和初始化单向channel

    var ch1 chan- int  // 声明ch1,只用于写int数据
    var ch2 -chan int  // 声明ch2,只用于读int数据
    ch3 := make(chan- int, 10)  // 初始化一个只写的channel
    ch4 := make(-chan int, 10)  // 初始化一个只读的chaannel

    补充:golang chan- 和 -chan,作为函数参数时

    开始时看到这个实在没明白怎么回事

    测试了下才知道原来

    -chan int 像这样的只能接收值

    chan- int 像这样的只能发送值

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • Golang 空map和未初始化map的注意事项说明
    • Golang 如何判断数组某个元素是否存在 (isset)
    • Go语言的Channel遍历方法详解
    • Golang 拷贝Array或Slice的操作
    • 基于Go Int转string几种方式性能测试
    • Go语言中break label与goto label的区别
    • Go 实现英尺和米的简单单位换算方式
    上一篇:Go语言的Channel遍历方法详解
    下一篇:Golang 如何判断数组某个元素是否存在 (isset)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang 函数返回chan类型的操作 golang,函数,返回,chan,类型,