我只想写一些这样的代码:
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
and string
。
现在我知道我错了,
[]type
是一个整体类型,不能视为[]interface{}
。
是的,那是因为interface{}
它是它自己的类型(而不是其他任何类型的“别名”)。
正如我在“ golang中的含义是interface{}
什么? ”(如果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
}
package main
import "fmt"
func main() {
x := []string{"a", "b", "c", "d"}
fmt.Printf("%T: %v\n", x, x)
//converting a []string to a []interface{}
y := make([]interface{}, len(x))
for i, v := range x {
y[i] = v
}
fmt.Printf("%T: %v\n", y, y)
//converting a []interface{} to a []string
z := make([]string, len(y))
for i, v := range y {
z[i] = fmt.Sprint(v)
}
fmt.Printf("%T: %v\n", z, z)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句