在Go中创建单向频道的重点是什么?

时间:2016-04-22 16:06:35

标签: go channel

在Go中,可以创建单向频道。在想要限制给定频道上可用的一组操作的情况下,这是非常方便的特征。但是,据我所知,此功能仅对函数的参数和变量类型规范有用,而通过make创建单向通道对我来说很奇怪。我已经阅读了这个question,但它不是关于在Go中创建只读通道的读取(或写入)通道,而是关于通常的使用情况。所以,我的问题是关于下一个代码的用例:

writeOnly := make(chan<- string)
readOnly := make(<-chan string)

2 个答案:

答案 0 :(得分:4)

理论上,您可以使用只写通道进行单元测试,以确保您的代码不会向通道写入超过特定次数的代码。

像这样:http://play.golang.org/p/_TPtvBa1OQ

package main

import (
    "fmt"
)

func MyCode(someChannel chan<- string) {
    someChannel <- "test1"
    fmt.Println("1")
    someChannel <- "test2"
    fmt.Println("2")
    someChannel <- "test3"
    fmt.Println("3")
}

func main() {
    writeOnly := make(chan<- string, 2) // Make sure the code is writing to channel jsut 2 times
    MyCode(writeOnly)
}

但对于单元测试而言,这将是非常愚蠢的技术。您最好创建一个缓冲通道并检查其内容。

答案 1 :(得分:1)

人们使用类型(尤其是Go)的一个主要原因是作为一种文档形式。能够显示通道是只读的还是只写的,可以帮助API的消费者更好地了解正在发生的事情。