我只想写一些这样的代码:
func (w Writer) WriteVString(strs []string) (int, error) {
return writeV(func(index int, str interface{}) (int, error) {
return w.WriteString(str.(string))
}, strs) // it doesn't work
}
func (w Writer) WriteV(bs [][]byte) (int, error) {
return writeV(func(index int, b interface{}) (int, error) {
return w.Write(b.([]byte))
}, []interface{}{bs...}) // it also can't be compiled
}
type writeFunc func(int, interface{}) (int, error)
func writeV(fn writeFunc, slice []interface{}) (n int, err error) {
var m int
for index, s := range slice {
if m, err = fn(index, s); err != nil {
break
}
n += m
)
return
}
I thought interface{}
can represent any type, so []interface
can also represent any []type
before, now I know I’m wrong, []type
是一个整体类型,不能认为是 []interface{}
。
那么,任何人都可以帮助我如何使这段代码工作,或者任何其他解决方案吗?
PS :我知道 []byte
或 string
可以相互转换,但这实际上不是我的意图,可能还有另一种类型而不是 []byte
string
。
原文由 zhuah 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,那是因为
interface{}
是它自己的类型(而不是任何其他类型的“别名”)。正如我在“ golang 中
interface{}
的含义是什么? ”中提到的那样(如果v
是一个interface{}
变量):常见问题解答提到
Tom L 提出 了这个例子(在 评论 中):