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

cos*_*ner 31 type-conversion go

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

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
}
Run Code Online (Sandbox Code Playgroud)

我以为interface{}可以代表任何类型,所以[]interface也可以代表[]type之前的任何类型,现在我知道我错了,[]type是一个整体类型,不能算是[]interface{}.

那么,任何人都可以帮助我如何使这个代码工作,或任何其他解决方案?

PS:我知道[]byte或者string可以相互转换,但实际上并不是我的意图,可能有另一种类型而不是[]bytestring.

Von*_*onC 37

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

是的,那是因为interface{}它是自己的类型(而不是任何其他类型的"别名").
正如我在" golang 的含义是interface{}什么? "中提到的那样(如果vinterface{}变量):

初学者被认为是" v任何类型",但这是错误的.
v不属于任何类型; 它是interface{}类型的.

常见问题中提到

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

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

t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}
Run Code Online (Sandbox Code Playgroud)


小智 11

  1. 创建一个实用函数,像这样
func ToGenericArray(arr ...interface{}) []interface{} {
    return arr
}
Run Code Online (Sandbox Code Playgroud)
  1. 并使用它:
func yourfunc(arr []interface{})  {
....
}

yourfunc(ToGenericArray([...]string{"a", "b", "c"}))

Run Code Online (Sandbox Code Playgroud)
  1. 重要通知:以下内容将不起作用
func yourfunc(arr []interface{})  {
....
}

arr:=[...]string{"a", "b", "c"}

yourfunc(ToGenericArray(arr))

Run Code Online (Sandbox Code Playgroud)