Go:type关键词总结
type关键词总结
type 用法:
- 定义结构体
- 定义接口
- 类型别名
- 类型定义
- 类型开关
类型定义和类型别名的区别:
区别就是类型定义是完全定义了一种新的类型,
而类型别名只是给现有的类型取了一个别名alias。(编译器会替换成基本类型。)
Type常见Demo
定义结构体
1 | type Demo struct {} |
定义接口
1 | type Demoer interface {} |
类型别名
1 | type Demo string |
类型定义
1 | type handle func(str string) |
类型开关
1 | func Demo(params ...interface{}) { |
类型注意事项
类型比较
备注:
参考Go文档type说明:
命名类型(简单类型),有类型名称如 int, int64, float, string, bool. 还有自定义的命名类型。
非命名类型(复杂类型),没类型名称 array slice, map,func(){}, interface{}。但是chan类型是可以==比较。
- slice 内存不连续,底层对象分开放的,不能直接比较;
- map 内存不连续,底层对象独立存放,不能直接比较;
- chan 内存是连续的,单一对象,可以直接比较;
当比较两个命名类型的时候,类型名称必须一样;当比较命名类型和非命名类型的时候,底层类型一样即可。
比较基于两个原则:1.内存底层基本类型;2.类型本身是否确定类型或不稳定类型;
空接口值比较
1 | package main |
类型可比较性
判断原则:
底层数据结构类型是否稳定和一致
类型 | 说明 |
---|---|
map | 宕机错误,不可比较 |
切片([]T) | 宕机错误,不可比较 |
通道(channel) | 可比较,必须由同一个 make 生成,也就是同一个通道才会是 true,否则为 false |
数组([容量]T) | 可比较,编译期知道两个数组是否一致 |
结构体 | 可比较,可以逐个比较结构体的值 |
函数 | 可比较 |
Go:type关键词总结