规范中的appending to slices部分提到了以下示例:
var t []interface{}
t = append(t, 42, 3.1415, "foo") // t == []interface{}{42, 3.1415, "foo"}
我在这里感到困惑,为什么我们可以将int
,float
和string
的值附加到元素为slice
类型的interface
?为什么append
的结果如此?我努力/长期,但我没有得到它。
答案 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。