我只想写一些像这样的代码:
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
}
我认为interface{}
可以代表任何类型,所以[]interface
也可以代表任何[]type
之前,现在我知道我错了,[]type
是一个整体类型,不能被视为[]interface{}
。
那么,任何人都可以帮助我如何使这个代码工作,或任何其他解决方案?
PS:我知道[]byte
或string
可以相互转换,但实际上并不是我的意图,可能还有另一种类型而不是[]byte
和string
。
现在我知道我错了,
[]type
是一个整体类型,不能被视为[]interface{}
。
是的,那是因为interface{}
是它自己的类型(而不是任何其他类型的“别名”)。
正如我在“what is the meaning of interface{}
in golang?”中提到的(如果v
是interface{}
变量):
初学者通过相信“
v
是任何类型”,但这是错误的。v
不属于任何类型;它是interface{}
类型。
他们在记忆中没有相同的表现形式。
有必要将元素分别复制到目标切片。 此示例将int切片转换为
interface{}
切片:
t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
s[i] = v
}