Hi有一个接受chan []byte
的函数(因为没有指定方向,我理解它是双向的)。该函数不发送或接收任何内容,只查看通道中与统计相关的元素数量。
我想在一个具有以下签名的函数中调用此函数:
func foo(fooChannel chan<- []byte)
但是,当我试图使用参数调用另一个函数时,我得到了错误cannot use fooChannel (type <-chan []byte) as type chan []byte in function argument
。
有没有办法将fooChannel转换为chan []byte
?
由于我只对获得一些统计数据感兴趣,我应该如何原型这个函数来接受任何类型的通道(这样我甚至可以去掉“字节”部分)?我只使用作为参数接收到的通道的len
和cap
。
发布于 2015-02-16 05:08:27
略作改动:
“有没有一种方法可以将一个定向通道投射到一个没有定向的通道?”不没有。
“Go中是否有‘任意通道’的概念(没有元素类型)?”不,没有。没有仿制药。
您必须编写几个函数。
发布于 2015-02-16 11:25:08
有没有将fooChannel转换为chan []字节的方法?
不,对不起。这可能是为了防止有人认为他们想发送到接收频道无论如何。但是,只是一个小小的东西,但是..。不是的。
该函数不发送或接收任何内容,只查看通道中与统计相关的元素数量。..。我只使用作为参数接收到的通道的
len
和cap
。
如果它不以任何信道的方式使用通道,您可以直接将len(ch)
和cap(ch)
作为参数传递。如果您出于任何原因不喜欢它,可以使用reflect
包,这将允许您在支持它的任何类型(数组、通道、切片)上调用len
和cap
。
这可能是一个好的开端:
package main
import (
"fmt"
"reflect"
)
func stats(i interface{}) {
v := reflect.ValueOf(i)
fmt.Printf("%s size: %d/%d\n", v.Kind(), v.Len(), v.Cap())
}
func main() {
ch := make(chan int, 10)
ch <- 1
stats(ch)
}
// Output: chan size: 1/10
https://stackoverflow.com/questions/28541658
复制相似问题