• Golang 的 `[]interface{}` 类型


    Golang 的 []interface{} 类型

    我其实不太喜欢使用 Go 语言的 interface{} 类型,一般情况下我宁愿多写几个函数:XxxInt, XxxFloat, XxxString……

    但是今天发现一个有意思的事情。

    假如我们有这样一个函数:

    func Foo(a interface{}) {}
    
    Foo(1)
    Foo("str")
    Foo(1.552)
    

    那么我们可以传入任何类型作为参数,因为任何类型都实现了 interface{} 接口,所以自然可以传入任意类型。

    当我们声明 interface{} 数组的时候,事情就变的不一样了:

    func Foo(a []interface{}) {}
    
    Foo([]int{1, 2, 3}) // 报错
    Foo([]string{"1", "2", "3"}) // 报错
    

    按照本身的设想,这里应该不管什么样的数组都可以作为参数传入,可是结果却恰恰相反:我们只能传入类型为 []interface{} 的元素。

    为什么呢?

    因为 []interface{} 类型变量拥有特定的内存结构

    每个 interface{} 占两个字(32 位机器一个字是 32 位,64 位机器一个字是 64 位)。其中,一个字用于存放 interface{} 真正传入的数据的类型;另一个字用于指向实际的数据。

    因此我们可以得出:长度为 n 的 []interface{} 切片的背后,是一个 n * 2 字 长的一块数据。这与一般的 []Type 类型切片不同的。

    而长度为 n 的 []Type 切片的背后数据分配的大小为为 n * sizeof(Type) 字 长。

    自然就不可以将 []int 类型作为 []interface{} 类型进行传递,只能自己写个循环将每一个 Type 都转化为 interface{}

    (完)

  • 相关阅读:
    Beta 冲刺(7/7)
    Beta 冲刺(6/7)
    Beta 冲刺(5/7)
    Beta 冲刺(4/7)
    Beta 冲刺(3/7)
    Beta 冲刺(2/7)
    Beta 冲刺(1/7)
    福大软工 · 第十次作业
    Adobe acrobat DC 2020 激活方法
    物理八年级下册2
  • 原文地址:https://www.cnblogs.com/xhyccc/p/15807778.html
Copyright © 2020-2023  润新知