在Golang中初始化接口数组

48

以下是一个变量的示例:

names := []interface{}{"first", "second"}

如何从字符串数组动态初始化它呢?


10
那不是一个数组,而是一个切片 - newacct
5个回答

55
strs := []string{"first", "second"}
names := make([]interface{}, len(strs))
for i, s := range strs {
    names[i] = s
}

将是最简单的。


1
谢谢!顺便说一句,我发现了一种不使用 make 的方法: names := []interface{}{} string_names := []string{"first", "second"} for _, v := range string_names { names = append(names, v) } - Kir
5
完全正确。但请注意,[]interface{}{} 用零长度初始化数组,并在调用 append 时增长长度(可能涉及复制)。通常情况下,这不是问题,如果您的数组不是非常大的话。如果它们很大,使用 make 进行完整长度初始化并避免复制(因为初始大小已知)会更好。 - val

39

append初始化了切片,因此这种方法可行:

var names []interface{}
names = append(names, "first")
names = append(names, "second")

这里是相同操作的变体,向append传递了更多的参数:

var names []interface{}
names = append(names, "first", "second")

这个一行代码也可以起作用:

names := append(make([]interface{}, 0), "first", "second")
也可以先将字符串切片转换为要添加到interface{}切片中的interface{}切片。

6
你可以使用 interface{} 数组来构建它。
values := make([]interface{}, 0)
values = append(values, 1, 2, 3, nil, 4, "ok")

在使用值时,请检查其类型。

for _, v := range values {
    if v == nil {
        fmt.Println("it is a nil")
    } else {
        switch v.(type) {
        case int:
            fmt.Println("it is a int")
        case string:
            fmt.Println("it is a string")
        default:
            fmt.Println("i don't know it")
        }
    }
}

-2

-13

另一种方式:

strs := []string{"first", "second"}
var names []string
names = append(names, strs...)

10
这不是一个界面,是吗? - Kir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接