golang 函数返回chan类型的操作

 更新时间:2021年04月29日 09:25:32   作者:CodeMechine  
这篇文章主要介绍了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 像这样的只能发送值

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

相关文章

  • Go每日一库之zap日志库的安装使用指南

    Go每日一库之zap日志库的安装使用指南

    这篇文章主要为大家介绍了Go每日一库之zap安装使用示例学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go语言中的if条件语句使用详解

    Go语言中的if条件语句使用详解

    这篇文章主要介绍了Go语言中的if条件语句的使用,包括if...else语句以及相关嵌套,需要的朋友可以参考下
    2015-10-10
  • go语言实现一个简单的http客户端抓取远程url的方法

    go语言实现一个简单的http客户端抓取远程url的方法

    这篇文章主要介绍了go语言实现一个简单的http客户端抓取远程url的方法,实例分析了Go语言http操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Golang中的select语句及其应用实例

    Golang中的select语句及其应用实例

    本文将介绍Golang中的select语句的使用方法和作用,并通过代码示例展示其在并发编程中的实际应用,此外,还提供了一些与select相关的面试题,帮助读者更好地理解和应用select语句
    2023-12-12
  • Go语言如何使用分布式锁解决并发问题

    Go语言如何使用分布式锁解决并发问题

    这篇文章主要为大家详细介绍了Go 语言生态中基于 Redis 实现的分布式锁库 redsync,并探讨其使用方法和实现原理,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03
  • Golang错误处理方式异常与error

    Golang错误处理方式异常与error

    我们在使用Golang时,不可避免会遇到异常情况的处理,与Java、Python等语言不同的是,Go中并没有try...catch...这样的语句块,这个时候我们如何才能更好的处理异常呢?本文来教你正确方法
    2023-01-01
  • Go Interface接口初学者手册

    Go Interface接口初学者手册

    这篇文章主要为大家介绍了Go Interface接口的基础用法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • pytorch中的transforms.ToTensor和transforms.Normalize的实现

    pytorch中的transforms.ToTensor和transforms.Normalize的实现

    本文主要介绍了pytorch中的transforms.ToTensor和transforms.Normalize的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Go语言计算两个经度和纬度之间距离的方法

    Go语言计算两个经度和纬度之间距离的方法

    这篇文章主要介绍了Go语言计算两个经度和纬度之间距离的方法,涉及Go语言相关数学函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Golang实现HTTP编程请求和响应

    Golang实现HTTP编程请求和响应

    本文主要介绍了Golang实现HTTP编程请求和响应,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论