自定义类型
在 Go 语言中,有许多默认数据类型,如 string,int,bool 等,也有许多复杂数据类型,如数组,切片,映射,结构体等。
除了这些内置类型,Go 允许我们使用默认类型创建自定义类型,通过 type 关键字来定义一个新类型,有两种常见方法:类型定义和类型别名。
声明新类型的作用主要有两个:
- 封装复杂的数据结构
- 提供更清晰的语义,极大的提高代码可读性和可靠性
类型定义
类型定义(Type Definition)是基于内置数据类型或其他自定义数据类型来定义一个新类型,这个新类型具有原有类型的所有属性和方法,但它们是不同的类型。
使用 type 关键字来定义自定义类型:
go
type t1 int // 使用类型定义创建新类型 t1
type t2 t1
func main() {
var a t1
var b t2 = 100
a = t1(b)
fmt.Printf("value: %v\ntype: %T\n", a, a) // 值 100 类型 main.t1
fmt.Printf("value: %v\ntype: %T\n", b, b) // 值 100 类型 main.t2
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
上面例子中,虽然 t1 和 t2 是不同类型,但它们的底层类型都是 int 类型,所以它们在本质上是相同的类型。本质上相同的两个类型,可以通过强制类型转换进行相互赋值。
类型别名
类型别名(Type Alias)就像一个人小时候有小名或乳名,上学后有学名,英语老师又给他起英文名,但这些名字都指的是他本人。
类型别名是在已有类型的基础上创建一个新类型,它们是同一类型的两个名称,所以它们可以互相赋值,它们只是为了提供更清晰的语义或用于解决包之间的命名冲突。
我们之前见过的 byte 和 rune 就是类型别名,他们的底层定义如下:
go
type byte = uint8
type rune = int32
1
2
2