内置函数“append”的工作原理:附加到其元素为interface类型的切片

时间:2018-04-12 17:09:23

标签: go

规范中的appending to slices部分提到了以下示例:

var t []interface{}
t = append(t, 42, 3.1415, "foo")   // t == []interface{}{42, 3.1415, "foo"}

我在这里感到困惑,为什么我们可以将intfloatstring的值附加到元素为slice类型的interface?为什么append的结果如此?我努力/长期,但我没有得到它。

1 个答案:

答案 0 :(得分:5)

由于:

  

所有类型都实现空接口

有关详细信息,请阅读ref spec for interfaces

interface类似于java中的Object,其中所有类型/类/等也是Object

您可以看到此效果by using reflect

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var t []interface{}
    z := append(t, "asdf", 1, 2.0)
    fmt.Println(z)

    for i := range z {
        fmt.Println(reflect.TypeOf(z[i]))
    }
}

输出:

[asdf 1 2]
string
int
float64

为什么会这样?好吧,想想JSON objects特别是序列化;类型可以是字符串,整数,对象等。这允许反序列化而不指定完全映射的结构(可能你不关心并只想要一些数据等)。基本上,它允许你有一种形式的弱打字"在Go;虽然仍然能够打字很强。

如下所述,reflect为您确定类型。编程时,您可能必须这样做manually