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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!