go_复合类型---结构体 一、结构体是什么结构体是将不同类型的数据组合成一个有机整体的自定义类型类似其他语言的「类」是 Go 面向对象编程的基础结构体成员变量不能写 var 关键字二、结构体定义go// 定义结构体类型 type Student struct { id int name string sex byte // 字符类型用 byte age int addr string }注意结构体名首字母大写可以被其他包访问成员名首字母大写才能被外部包访问三、结构体普通变量初始化1. 顺序初始化必须给所有成员赋值govar s1 Student Student{1, mike, m, 18, bj} fmt.Println(s1 , s1)2. 指定成员初始化未初始化成员自动赋值为 0 值gos2 : Student{id: 2, name: tom, age: 20} fmt.Println(s2 , s2)四、结构体指针变量初始化1. 取地址初始化必须加 govar p1 *Student Student{1, mike, m, 18, bj} fmt.Println(*p1 , *p1)2. 自动推导类型最常用gop2 : Student{3, jack, f, 22, sh} fmt.Println(*p2 , *p2)五、结构体成员操作1. 普通变量使用.运算符govar s Student // 赋值 s.id 1 s.name mike s.sex m s.age 18 s.addr bj // 访问 fmt.Println(s.name, s.age)2. 指针变量操作成员规则指针有合法指向后才能操作成员方式 1先定义普通变量再取地址govar s Student var p1 *Student p1 s // 指向 s // 两种写法完全等价 p1.id 1 // 简化写法 (*p1).name mike // 原始写法方式 2使用new申请结构体推荐gop2 : new(Student) // 自动分配内存返回 *Student 类型 p2.id 1 p2.name mike六、结构体比较与赋值1. 结构体比较只有同类型结构体可以比较逐成员对比值是否相等gos1 : Student{1, mike, m, 18, bj} s2 : Student{1, mike, m, 18, bj} s3 : Student{2, mike, m, 18, bj} fmt.Println(s1 s2, s1 s2) // true fmt.Println(s1 s3, s1 s3) // false2. 结构体赋值同类型结构体变量可以直接赋值值拷贝govar tmp Student tmp s3 fmt.Println(tmp , tmp)七、结构体作为函数参数重点1. 值传递拷贝一份不修改实参gofunc test01(s Student) { s.id 666 // 只改副本 } // 调用 test01(s1)特点函数内修改不会影响原变量。2. 地址传递引用传递可修改实参gofunc test02(p *Student) { p.id 666 // 直接修改原变量 } // 调用 test02(s1)特点效率高适合大结构体可修改实参。八、高频易错点总结结构体成员不能写 var指针初始化必须写Student{}指针操作成员用.即可不用-比较必须是同类型结构体函数传参值传递不修改原数据地址传递修改原数据效率更高