将[]字符串转换为[] interface {}

问题描述 投票:23回答:1

我只想写一些像这样的代码:

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:我知道[]bytestring可以相互转换,但实际上并不是我的意图,可能还有另一种类型而不是[]bytestring

go type-conversion
1个回答
27
投票

现在我知道我错了,[]type是一个整体类型,不能被视为[]interface{}

是的,那是因为interface{}是它自己的类型(而不是任何其他类型的“别名”)。 正如我在“what is the meaning of interface{} in golang?”中提到的(如果vinterface{}变量):

初学者通过相信“v是任何类型”,但这是错误的。 v不属于任何类型;它是interface{}类型。

FAQ mentions

他们在记忆中没有相同的表现形式。

有必要将元素分别复制到目标切片。 此示例将int切片转换为interface{}切片:

t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}
© www.soinside.com 2019 - 2024. All rights reserved.