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
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐