Go 的数据类型总结

元素 零值 初始化 类型 类型元数据
bool false := true 值类型 Bool
字符 (string) “” := “word” 值类型 String
数字 (int) 0 := 1 值类型 Int
数组 取决于子元素 := [N] 元素 {…} 值类型 arraytype
Struct 取决于子元素 := 结构 {…} 值类型 structtype
指针 nil := &v 引用 ptrtype
Slice nil := make ([] 元素,len, cap) 引用 slicetype
Map nil := make (map 结构,hint) 引用 maptype
Channel nil := make (channel 元素,size) 引用 chantype
Func nil := func 结构 引用 functype
Interface nil := 接口实例 引用 interfacetype

PS1:map 的 key 不能是 func、map、slice
PS2:make 只能初始化 map、slice、chan;new 可以初始化任意类型
PS3:make map 的第二个参数 hint 是估算值:hmap.B 刚好满足 hint < 6.5 * 2 ^ B。参考 Golang Map 实现 (二) map 的创建

能和 nil 值比较的 6 种类型#

  • 深度剖析 Go 的 nil
    元素 数据结构 nil 赋值 nil 值判断
    指针 uintptr 8 字节置 0 值是否为 0
    Slice slice{} 24 字节置 0 data 指针是否为 0,无视 len、cap
    Map &hmap{} 8 字节置 0 8 字节是否为 0
    Channel &hchan{} 8 字节置 0 8 字节是否为 0
    Func uintptr 8 字节置 0 8 字节是否为 0
    Interface efaceiface 16 字节置 0 _type 为 0,无视 data

类型比较#

  • 浅析 go 中的类型比较
  • 按类型分类
    1. 基本类型:整型、浮点型、复数型、布尔型、字符串
    2. 复合类型:array、struct
    3. 引用类型:slice、map、func、channel、指针
    4. 接口类型:runtime.eface 结构体、runtime.iface 结构体
  • 可比较类型:
    1. 基本类型:都可以
    2. 复合类型:如果含有不可比较类型,则不可比较
    3. 引用类型:可比较的有 channel 和指针,其他不可 (只能和 nil 比较)
    4. 接口类型:
      • runtime.eface 结构体,可比较,当类型相同且值相同时才为 true
      • runtime.iface 结构体,一个接口可以转化成另一个接口,则可比较
  • reflect.DeepEqual 函数可以用来比较两个任意类型的变量

代码示例#

sliceB = sliceA      //浅拷贝,内存指针一样
copy(sliceB, sliceA) //深拷贝,两块内存

// runtime.eface结构体
var a interface{} = 0
var b interface{} = 2
println(a == b)

// runtime.iface结构体
var f *os.File
var f1 io.Reader = f
var f2 io.ReadCloser = f
var f3 io.Writer = f
println(f1 == f2) //可比较
println(f1 == f3) //编译报错
本作品采用《CC 协议》,转载必须注明作者和本文链接