结构体:
结构体的创建与初始化:
创建格式:
type 结构体名 struct {
成员名 数据类型
}
顺序初始化格式:
var 变量名 结构体名 = 结构体名{成员值1,成员值2}
部分初始化格式:
var 变量名 结构体名 = 结构体名{成员名:成员值,成员名:成员值}
通过结构体变量.成员方式初始化:
var 变量名 结构体名
变量名.成员名 = 成员值
演示:
// 结构体可以创建在函数外面,这样是全局的,如果是定义在函数的里面就是局部的
type Student struct {
// 成员名称不加var关键字
id int
name string
age int
addr string
}
func structDemo() {
// 顺序初始化
var s1 Student = Student{001, "itzhuzhu", 23, "广州"}
// 部分初始化
var s2 Student = Student{name: "itzhuzhu", age: 23}
//通过结构体变量.成员方式初始化
var stu Student
stu.name = "itzhuzhu"
stu.id = 23
fmt.Println(s1) //{1 itzhuzhu 2 广州}
fmt.Println(s2) //{0 itzhuzhu 23 }
fmt.Println(stu) //{23 itzhuzhu 0 }
}
结构体与数组:
结构体数组定义:
// 数组需要要指定长度
var 结构体数组名[索引] 结构体类型 = [索引] 结构体类型{}
数组修改结构体成员的值:
结构体数组名[索引].成员=值
演示:
func structDemo02() {
var arr [3]Student = [3]Student{
Student{001, "itzhuzhu", 23, "广州"},
Student{002, "itzhuzhu2", 23, "广州2"},
Student{003, "itzhuzhu3", 23, "广州3"},
}
fmt.Println(arr) //[{1 itzhuzhu 23 广州} {2 itzhuzhu2 23 广州2} {3 itzhuzhu3 23 广州3}]
fmt.Println(arr[0]) //{1 itzhuzhu 23 广州}
fmt.Println(arr[0].name, arr[0].age) //itzhuzhu 23
//结构体数组名[索引].成员=值
arr[0].addr = "深圳"
fmt.Println("成员值修改后", arr[0]) //{1 itzhuzhu 23 深圳}
// 通过循环输出结构体数组中的内容
for i := 0; i < len(arr); i++ {
fmt.Println("通过循环输出结构体数组全部的内容:", arr[i])
fmt.Println("通过循环输出结构体数组指定的内容:", arr[i].id)
}
for key, value := range arr {
fmt.Println("key:", key)
fmt.Println("value:", value)
fmt.Println("打印指定内容:", value.age)
}
}
结构体与切片:
结构体切片定义:
var 结构体数组名[] 结构体类型 = [] 结构体类型{}
切片修改结构体成员的值:
结构体切片名[索引].成员=值
演示:
func structDemo03() {
var arr []Student = []Student{
Student{001, "itzhuzhu", 23, "广州"},
Student{002, "itzhuzhu2", 23, "广州2"},
Student{003, "itzhuzhu3", 23, "广州3"},
}
fmt.Println(arr) //[{1 itzhuzhu 23 广州} {2 itzhuzhu2 23 广州2} {3 itzhuzhu3 23 广州3}]
fmt.Println(arr[0]) //{1 itzhuzhu 23 广州}
fmt.Println(arr[0].name, arr[0].age) //itzhuzhu 23
//结构体数组名[索引].成员=值
arr[0].addr = "深圳"
fmt.Println("成员值修改后", arr[0]) //{1 itzhuzhu 23 深圳}
// 通过循环输出结构体数组中的内容
for i := 0; i < len(arr); i++ {
fmt.Println("通过循环输出结构体切片全部的内容:", arr[i])
fmt.Println("通过循环输出结构体切片指定的内容:", arr[i].id)
}
for key, value := range arr {
fmt.Println("key:", key)
fmt.Println("value:", value)
fmt.Println("打印指定内容:", value.age)
}
// 追加数据
arr = append(arr, Student{004, "itzhuzhu4", 23, "佛山"})
fmt.Println(arr)
}
结构体与map:
结构体map的定义:
make(map[key的类型]value的类型)
演示:
func structDemo04() {
m := make(map[int]Student)
m[0] = Student{001, "itzhuzhu", 23, "广州"}
m[1] = Student{002, "itzhuzhu2", 23, "广州"}
m[2] = Student{003, "itzhuzhu3", 23, "广州"}
fmt.Println("全部数据:", m)
fmt.Println("指定索引数据:", m[0])
fmt.Println("指定索引成员数据:", m[0].name)
delete(m, 0)
for key, value := range m {
fmt.Println("key:", key)
fmt.Println("value:", value)
fmt.Println("value.name:", value.name)
fmt.Println("value.name:", value.name)
}
}
结构体作为函数参数:
创建格式:
func 函数名(结构体){
函数体
}
调用格式:
函数名(结构体)
演示:
func main() {
stu := Student{001, "itzhuzhu", 23, "广州"}
structDemo05(stu)
fmt.Println(stu)
}
func structDemo05(stu Student) {
// 修改结构体的成员,不会影响到原结构体
stu.id = 999
fmt.Println(stu)
}
求最大学生年龄:
演示:
func main() {
stu := make([]Student, 3)
structDemo06(stu)
}
func structDemo06(stu []Student) {
//定义年龄最大的变量
max := stu[0].age
//定义年龄最大的学生索引
var maxIndex int
for i := 0; i < len(stu); i++ {
fmt.Printf("请输入第%d个学生的详细信息\n", i+1)
//切片是Student的类型,Student中有多个成员,所以要把里面的每个成员都赋值
fmt.Scan(&stu[i].id, &stu[i].name, &stu[i].age, &stu[i].addr)
// 如果大于最大年龄就重新赋值,然后把最大年龄的学生索引给定义的变量赋值
if stu[i].age > max {
max = stu[i].age
maxIndex = i
}
}
fmt.Println(stu[maxIndex])
}