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 协议》,转载必须注明作者和本文链接
推荐文章: