一、类型type
type myint1 int //自定义类型
type myint2 = int //类型别名
func main() {
var m myint1
m = 100
fmt.Printf("%T\n", m) //main.myint1
var n myint2
n = 200
fmt.Printf("%T\n", n) //int
}
二、结构体
1.定义
//方法1:常规定义
type person struct {
name string
age int
sex string
}
//方法2:匿名字段定义
type animal struct {
//每种类型只能出现一次,尽量避免使用这种方法
string
int
}
2.结构体初始化
type person struct {
name string
age int
sex string
}
func main() {
//方法1:常规初始化
var v person
v.name = "zhangsan"
v.age = 20
v.sex = "男"
fmt.Println(v) //{zhangsan 20 男}
//方法2:key-value初始化使用方法
var v2 = person{
name: "lisi",
age: 20,
sex: "男",
}
fmt.Println(v2) //{lisi 20 男}
//方法3:值列表初始化,值的顺序要和类型的字段定义顺序一样
var v3 = person{
"wangwu",
25,
"女",
}
fmt.Println(v3) //{wangwu 25 女}
}
3.匿名结构体
var v struct {
name string
age int
sex string
}
v.name = "zhangsan"
v.age = 20
v.sex = "男"
fmt.Println(v) //{zhangsan 20 男}
4.结构体指针
type person struct {
name string
age int
sex string
}
func main() {
//定义方法1
var p = new(person)
p.name = "zhangsan"
p.age = 20
p.sex = "男"
fmt.Println(p) //&{zhangsan 20 男}
fmt.Printf("%T\n", p) //*main.person
//定义方法2
var p1 = &person{
name: "lisi",
age: 20,
sex: "男",
}
fmt.Println(p1) //&{lisi 20 男}
//定义方法3
var p2 = &person{
"wangwu",
25,
"女",
}
fmt.Println(p2) //&{wangwu 25 女}
}
5.接收者:给自定义类型定义方法
注意:接收者方法首字母大写表示方法是公共的,表示外部包可以访问
type person struct {
name string
age int
sex string
}
//值接收者,传递结构体变量副本
func (p person) changeName1(name string) {
p.name = name
}
//指针接收者,传递结构体变量指针
func (p *person) changeName2(name string) {
p.name = name
}
func main() {
var p1 = person{
name: "lisi",
age: 20,
sex: "男",
}
//值接收者
p1.changeName1("zhangsan")
fmt.Printf("我的名字叫:%s\n", p1.name) //我的名字叫:lisi
//指针接收者
p1.changeName2("zhangsan")
fmt.Printf("我的名字叫:%s\n", p1.name) //我的名字叫:zhangsan
}
6.结构体嵌套
- 常规嵌套
type animal struct {
name string
age int
}
type dog struct {
height string
anl animal
}
func main() {
//方法1:
var v dog
v.anl.name = "beibei"
v.anl.age = 20
v.height = "80cm"
fmt.Println(v) //{80cm {beibei 20}}
//方法2:
var v2 = dog{
height: "90cm",
anl: animal{
"xiaopei",
15,
},
}
fmt.Println(v2) //{90cm {xiaopei 15}}
}
- 匿名嵌套
type animal struct {
name string
age int
}
type dog struct {
height string
animal
}
func main() {
//方法1:
var v dog
v.name = "beibei"
v.age = 20
v.height = "80cm"
fmt.Println(v) //{80cm {beibei 20}}
//方法2:
var v2 = dog{
height: "90cm",
animal: animal{
"xiaopei",
15,
},
}
fmt.Println(v2) //{90cm {xiaopei 15}}
}