文章目录
go语言学习:go类型系统
此文章作者看书《go语言实战》总结而来,为作者自己备忘使用。如果能帮助到他人,是我的荣幸。也请各位看官觉得文章中那么不对能及时指出,共同进步。
go语言是静态语言,这意味着编译器需要在编译时知道变量的类型。类型提供给编译期的信息:
- 内存规模:编译期得知该分配多少内存
- 内存表示信息:内存中存放的是何物
1. 自定义类型
1.1. 用户可以使用struct
自定义结构
/* 代码片段 5.1 */
// 声明一个用户类型 name
type name struct {
firstname string
lastname string
}
// 声明一个name变量。使用变量的默认值初始化。数值:0;字符串:"";布尔类型:false
var name1 name
// 使用 结构字面量 方式1 声明并初始化
name2 := name{
firstname: "kris",
lastname: "who", // 每一行末尾需要逗号。值顺序不重要
}
// 使用 结构字面量 方式2 声明并初始化
name3 := name {
"kris", "wu"} // 值的顺序重要
// 定义嵌套结构
type person struct {
_name name,
_sex string
}
1.2. 基于已有基础类型声明新类型
/* 代码片段 5.2 */
type Duration int64
Duration类型虽然使用int64类型表示,但编译器会将两者视为不同的类型。即使能相互兼容,但不能相互赋值。编译器不会对不同类型的值做隐式转化(这点和C++有点差异)。
2、方法
方法能给用户定义的类型添加新的行为。
/* 代码片段 5.3 */
// 以 代码片段 5.1 的name结构体为例
func (n name) getName() {
fmt.Printf("first name:%s, last name:%s", n.firstname, n.lastname)
}
func (n *name) getLastName() {
return n.lastname
}
上诉代码中func
和函数名(getName)之间的参数被称为接收者,如果一个函数有接收者,那该函数就被称为方法。
接收者分为:值接收者 和 指针接收者。参数传递的规则和C++中的函数参数传递规则相同,即值接收者时,是通过值副本的方式传递;指针接收者时,通过传递指针的副本,但本质上指向的是同一块内存。
无论你在定义方法时使用的是值接收者还是指针接收者,都可以通过变量或变量指针来调用。即
/* 代码片段 5.4 */
// 使用 代码片段 5.1 的name结构体为例
name2 := name{
firstname: "kris",
lastname