Go的类型系统和结构struct
一.命名类型
1.基础
Go是强类型的语言,编译器在编译时会进行严格的类型校验。
Go的类型可以分为命名类型和未命名类型两类。
2.命名类型
1.类型可以通过标识符来表示,这种类型称为命名类型。Go语言的基本类型中有20个预声明简单类型都是命名类型(int、int16、int64、byte、string等)
2.Go语言还有一种命名类型——用户自定义类型,就是用关键字type来定义的新类型,如前面曾经遇到过的定义函数类型。
3.未命名类型
1.一个类型由预声明类型、关键字和操作符组合而成,这个类型称为未命名类型。未命名类型又称为类型字面量(Type Literal)。
2.Go 语言的基本类型中的复合类型:数组、切片、字典、通道、指针、函数、结构和接口都属于类型字面量,也都是未命名类型。例如*int、[ ]int、[3]int、map[string]int等都是未命名类型。
4.自定义类型
格式:type 新类型名 原类型表达式
自定义类型都是命名类型。
自定义类型举例
type Map map[string]int 索引为字符串,键值为整数的字典
type Fun func(int, int) int 接收两个整型参数并返回一个整数的函数
type Slice [ ]int 整数切片
type Str [4]string 大小为4的字符串数组
说明:可以使用Printf函数结合%T格式符输出数据类型,%v输出数据值。
5.强制类型转换
格式:a T = (T)(b),用括号将类型和要转换的表达式括起来(类型也可以不括)。
注意:
数值类型和string类型之间的相互转换可能造成值部分丢失;其他的转换仅是类型的转换,不会造成值的改变。
字符串和数字之间的转换可使用标准库strconv。
二.结构struct
1.结构体定义
GO语言中也和C语言一样,可以声明新的类型作为其它类型的属性或字段的容器。这个工具就是struct。
type person struct {
name string
age int
}
一般使用类型定义关键字type将结构体赋予一个新的类型名,比如上面的结构体就有一个新的类型名person,后面使用person这个类型就可以定义结构体变量。
定义结构体变量及初始化
var a person // 直接定义person类型的变量
var b person = person{name: “dhjasd”, age: 20} //定义初始化
结构体变量
P1 := person{“hdjajda”, 25} // 按照顺序提供初始化值
P2 := person{age:24, name: “djajkddk”} // 通过field:value的
方式初始化,这样可以任意顺序
P3 := new(person) // 用new函数分配一个指针,此处P的类型为*person
P4 := person{}
2.struct的匿名字段
GO支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。
当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入到当前定义的这个struct。
type person struct {
name string //姓名
age int //年龄
}
type student struct {
person // 匿名字段,意思是student包含了person的所有字段
xuehao string
}
使用匿名字段
a := student{person{“aaaa”, 25}, “20101101000”} // 初始化一个学生
fmt.Println("name is ", a.name) // 访问成员
a.age += 2 // 修改成员
a.person = person{“dsadhsa”, 55} // 直接访问匿名字段
a.person.age -= 1 // 通过匿名字段访问其成员
on = person{“dsadhsa”, 55} // 直接访问匿名字段
a.person.age -= 1 // 通过匿名字段访问其成员