01-类型转换与别名
1、数据类型转换
1.1、显式转换
Go 在不同类型的变量之间赋值时需要显式转换。也就是说 Go 中数据类型不能自动转换。
1.2、数值类型转换
1 |
|
注意:在转换中,比如将int64
转成int8【-128---127】
,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。 因此在转换时,需要考虑范围。
1.3、基本数据类型与字符串转换
基本数据类型转字符串:fmt.Sprintf()
该函数会返回转换后的字符串
1 |
|
字符串转基本数据类型:使用包strconv
1 |
|
注意:在将String
类型转成基本数据类型时,要确保String
类型能够转成有效的数据,比如可以把”123”,转成一个整数,但不能转换”hello”,如果这样做,Golang 直接将其转成0
,其它类型也是一样的道理,如:float => 0 bool => false
。
2、类型别名
2.1、类型别名的使用
Go 在 1.9 版本加入了类型别名。主要用于代码升级、迁移中类型的兼容问题(C/C++中使用宏来解决重构升级带来的问题)。
Go1.9 之前的版本内部定义了新的类型byte和rune,用于指代uint8
和int32
:
1 |
|
Go1.9之后uint8
和int32
使用了类型别名:
1 |
|
2.2、不同包下的类型定义
如下示例,在项目根目录新建文件夹mypack
,在该目录建立person.go
文件:
1 |
|
在main.go中,如下使用:
1 |
|
2.3、不同包下的类型别名
2.2 中的案例如果将类型定义改为类型别名:
1 |
|
使用方式:必须直接在 person 文件中直接使用类型别名
1 |
|
3、Go 的类型系统补充
3.1、命名类型和未命名类型
- 命名类型:Named Type。类型通过标识符、自定义类型表示
- 未命名类型:Unamed Type。也称为类型字面量(Type Literal),由预声明类型、关键字、操作符等组合而成,如array、slice、channel、pointer、function、未使用 type 定义的 struct、未使用 type 定义的 interface。
示例:
1 |
|
3.2、底层类型
所有类型都有一个底层类型 underlying type,其规则如下:
- 预声明类型(Pre-declared types)和类型字面量(type literals)的底层类型是他们自身
- 自定义类型
type newtype oldtype
中 newtype 的底层类型是逐层递归向下查找的,直到找到 oldtype 的预声明类型或字面量类型
3.3、Go 中的类型相同
Go 中类型相同的规范:
- 命名类型的数据类型相同:声明语句必须完全相同
- 未命名类型数据类型相同:类型声明字面量结构相同,且内部元素的类型相同
- 命名类型与未命名类型永远不同
- 通过类型别名语句声明的两个类型相同。类型别名语法:
type T1 = T2
01-类型转换与别名
https://flepeng.github.io/021-Go-31-Go-基础-01-类型转换与别名/