Go语言append内置函数:interface类型切片追加不同值的疑问
关于Go语言interface{}切片追加不同类型值的疑问解答
先把你的问题再明确下,方便咱们梳理:
为何能将int、float、string类型的值追加到元素为interface{}类型的切片中?且追加结果为何是
[]interface{}{42, 3.1415, "foo"}?
一、为什么不同类型值能被追加到interface{}切片?
这核心在于Go的**空接口interface{}**特性:
- 空接口是最基础的接口类型,它没有定义任何方法。在Go的规则里,所有类型都自动实现了空接口——毕竟不需要实现任何方法,天然满足接口要求。
- 当你把具体类型(比如
int、float64、string)的值赋值给interface{}类型变量时,Go会自动完成“包装”:每个interface{}值其实是一个包含两部分的结构,一部分是值的类型信息,另一部分是值本身。这个过程完全隐式,不用你手动写转换代码。 - 而
[]interface{}就是元素类型为空接口的切片,它的每个元素都能容纳任意类型的“包装后”值,所以不同类型的值自然能被追加进去。
二、为什么追加结果是那样的?
看你给出的代码:
var t []interface{} t = append(t, 42, 3.1415, "foo")
执行append时,每个参数都会被隐式转换成interface{}类型:
42是int类型,包装后,interface{}内部存储的是int类型标识和值42;3.1415是float64类型(Go里浮点数字面量默认是float64),包装后存储的是float64类型标识和值3.1415;"foo"是string类型,包装后存储的是string类型标识和值"foo"。
所以最终t切片里的三个元素,就是这三个被包装好的interface{}值,和[]interface{}{42, 3.1415, "foo"}完全等价。
要是你后续想把这些值还原成具体类型,可以用类型断言,比如:
// 尝试取出第一个元素的int值 if num, ok := t[0].(int); ok { fmt.Println(num + 1) // 会输出43 }
内容的提问来源于stack exchange,提问作者Megidd
相关产品推荐
相关产品推荐

