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中的类型比较
- 按类型分类
- 基本类型:整型、浮点型、复数型、布尔型、字符串
- 复合类型:array、struct
- 引用类型:slice、map、func、channel、指针
- 接口类型:runtime.eface结构体、runtime.iface结构体
- 可比较类型:
- 基本类型:都可以
- 复合类型:如果含有不可比较类型,则不可比较
- 引用类型:可比较的有channel和指针,其他不可(只能和nil比较)
- 接口类型:
- 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 协议》,转载必须注明作者和本文链接