将[] string转换为[] interface {}
我只想编写这样的代码:
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{}
。
因此,有人可以帮助我如何使此代码正常工作,或其他解决方案吗?
:我知道[]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
}
TomL提出了这个示例(在评论中:
package mainimport "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)
}
以上是 将[] string转换为[] interface {} 的全部内容, 来源链接: utcz.com/qa/400954.html