Go 语言中结构体struct是自定义复合类型用来将多个不同类型的字段变量组合在一起描述一个事物的属性相当于其他语言的「类」但 Go 没有类结构体是实现面向对象编程的核心。一、基础定义与声明1. 定义结构体使用typestruct关键字定义// 语法 type 结构体名 struct { 字段名 字段类型 字段名 字段类型 // ... }示例定义一个「人」的结构体// 定义 Person 结构体 type Person struct { Name string // 姓名 Age int // 年龄 City string // 城市 }2. 创建结构体实例赋值有 4 种常用方式package main import fmt type Person struct { Name string Age int City string } func main() { // 方式1按字段顺序赋值必须严格对应 p1 : Person{张三, 20, 北京} // 方式2指定字段名赋值推荐顺序无关 p2 : Person{Name: 李四, Age: 25} // 方式3先声明后赋值 var p3 Person p3.Name 王五 p3.Age 30 p3.City 上海 // 方式4指针方式创建推荐用于大结构体节省内存 p4 : Person{Name: 赵六, Age: 35, City: 深圳} // 打印结果 fmt.Println(p1, p2, p3, p4) }3. 访问结构体字段直接使用.访问// 普通实例 fmt.Println(p1.Name) // 输出张三 p1.Age 21 // 修改字段 // 指针实例Go 自动解引用无需写 * fmt.Println(p4.City) // 输出深圳二、结构体进阶用法1. 结构体嵌套组合结构体可以嵌套其他结构体实现「属性包含」// 地址结构体 type Address struct { Province string Street string } // 用户结构体嵌套 Address type User struct { ID int Username string Addr Address // 嵌套结构体 } // 使用 u : User{ ID: 1, Username: admin, Addr: Address{ Province: 广东, Street: 科技园路, }, } // 访问嵌套字段 fmt.Println(u.Addr.Province) // 输出广东2. 匿名嵌套简化访问省略字段名直接嵌套结构体类型可以直接访问嵌套字段type User struct { ID int Username string Address // 匿名嵌套 } // 使用 u : User{ ID: 1, Username: admin, Address: Address{Province: 广东, Street: 科技园路}, } // 直接访问匿名嵌套字段简化写法 fmt.Println(u.Province) // 直接访问无需 u.Address.Province3. 结构体方法给结构体绑定函数这是 Go 实现「面向对象」的核心给结构体定义专属函数方法// 语法func (接收者 结构体类型) 方法名() 返回值 {} // 给 Person 定义一个打招呼的方法 func (p Person) SayHello() { fmt.Printf(大家好我是 %s今年 %d 岁\n, p.Name, p.Age) } // 定义修改年龄的方法必须用指针接收者否则修改的是副本 func (p *Person) GrowUp() { p.Age } // 使用 p : Person{Name: 张三, Age: 20} p.SayHello() // 输出大家好我是 张三今年 20 岁 p.GrowUp() // 年龄1 fmt.Println(p.Age) // 输出21接收者两种类型区别表格接收者类型用法适用场景值接收者(p Person)不修改原结构体只读操作获取数据、打印、计算指针接收者(p *Person)可修改原结构体节省内存修改字段、大结构体避免拷贝4. 结构体标签Tag结构体字段后加反引号key:value用于序列化、数据库映射、校验等最常用在 JSON 转换type User struct { ID int json:user_id db:id // JSON 字段名改为 user_id Username string json:username db:name // 数据库映射为 name Age int json:age,omitempty // 为空时忽略该字段 }三、零值与初始化结构体未赋值时所有字段为对应类型零值字符串空、数字 0、指针 nil可以使用new()初始化返回指针四、结构体比较相同结构体类型可以直接用比较所有字段都相等则结构体相等包含切片、map等不可比较类型的结构体不能用比较五、完整实战示例package main import encoding/json import fmt // 定义结构体 标签 type Student struct { ID int json:id Name string json:name Score float64json:score } // 结构体方法获取成绩等级 func (s Student) GetLevel() string { if s.Score 90 { return A } else if s.Score 60 { return B } return C } func main() { // 1. 创建实例 stu : Student{ID: 1, Name: 小明, Score: 95.5} // 2. 调用方法 fmt.Println(成绩等级, stu.GetLevel()) // A // 3. 结构体转 JSON jsonData, _ : json.Marshal(stu) fmt.Println(JSON, string(jsonData)) // 输出{id:1,name:小明,score:95.5} }总结结构体是 Go 的复合类型用于封装多个不同类型字段描述事物属性核心用法定义结构体 → 创建实例 → 访问字段 → 绑定方法指针接收者用于修改结构体值接收者用于只读操作标签Tag常用于 JSON、数据库等场景的字段映射结构体是 Go 面向对象编程的基础替代了其他语言的「类」