Go自定义类型、类型别名和结构体
自定义类型
type 自定义类型名 类型
示例
type myInt int
var n myInt
fmt.Printf("%T\n", n)
输出:main.myInt
说明
- 自定义类型在编译后仍然是我们定义的类型
- 自定义类型可以对基本类型进行拓展与改变
类型别名
type 类型别名=类型
示例
type myInt = int
var n myInt
fmt.Printf("%T\n", n)
输出:int
说明
类型别名并不改变变量的本质属性
类型别名在编译后会变回原变量类型
类型别名的意义在于给指定的类型赋于更直白的类型以便得代码更适合阅读与解析
结构体
定义格式
type 类型名 struct{
字段名 字段类型
字段名 字段类型
...
}
//匿名结构体
var 变量名 struct{
字段名 字段类型
字段名 字段类型
...
}
//连续的同类型字段可以用字段类型简写
type 类型名 struct{
字段1,字段2 字段类型
...
}
示例
type student struct{
name string //姓名字段
id int //学号字段
gender byte //性别字段
}
说明
结构体名在一个包内必须是唯一的
字段名在一个结构内是唯一的
结构体可以在函数内定义
使用
type person struct{
name string
id int
}
func main(){
//先声明再初始化
var a person
a.name = "张三"
a.id = 1
fmt.Println(a)
a.id = 2
fmt.Println(a)
fmt.Println(a.name)
//声明变量同时初始化key-value模式
var b = person{
name: "小飞侠"
id: 7
}
//声明变量同时用值列表进行初始化
var c = person{
"唐伯虎"
9527
}
}
//输出{张三 1} {张三 2} 张三
用函数修改结构体字段的值
func f1(p person){
p.name = "李四"
}
func f2(p *person){
p.name = "李四" // <=> (*p).name = "李四"
}
func main(){
var a person
a.name = "张三"
a.id =1
fmt.Println(a) // {张三 1}
f1(a)
fmt.Println(a) // {张三 1}
//无法改变,因为go中传入的永远是参数的复本
f2(&a)
fmt.Println(a)// {李四 1}
//结构体指针
var c = new(person) //c是一个person类型的指针
c.name = "飞天小猪"
c.id = 17
f2(c)
fmt.Println(*c)
}
内存
结构的各个字段内存是连续的