结构体是Go语言中组织相关数据的复合类型,将多个不同类型的数据组合在一起形成新的数据类型。
结构体定义语法:
type 结构体名称 struct {
字段1 类型1
字段2 类型2
...
}
结构体初始化方式:
var声明:var p Person(各字段为零值)Person{字段1: 值1, 字段2: 值2}new()函数:new(Person)(返回指针)字段访问: 使用点号.操作符
真实业务场景:用户管理系统 在电商平台、社交应用等系统中,需要管理用户信息,包括基本信息、联系方式、个人资料等。结构体可以完美地组织这些相关信息。
package main
import "fmt"
// 定义地址结构体
type Address struct {
Province string
City string
Street string
ZipCode string
}
// 定义用户结构体
type User struct {
ID int
Username string
Password string
Email string
Age int
IsActive bool
Address Address // 嵌套结构体
}
func main() {
// 方式1:分别初始化嵌套结构体
addr := Address{
Province: "广东省",
City: "深圳市",
Street: "科技园路123号",
ZipCode: "518000",
}
user1 := User{
ID: 1001,
Username: "zhangsan",
Password: "encrypted_pwd",
Email: "zhangsan@example.com",
Age: 25,
IsActive: true,
Address: addr,
}
// 方式2:整体初始化
user2 := User{
ID: 1002,
Username: "lisi",
Email: "lisi@company.com",
Age: 30,
IsActive: true,
Address: Address{
Province: "北京市",
City: "海淀区",
Street: "中关村大街456号",
ZipCode: "100080",
},
}
// 字段访问
fmt.Printf("用户: %s, 城市: %s\n", user1.Username, user1.Address.City)
fmt.Printf("用户: %s, 城市: %s\n", user2.Username, user2.Address.City)
// 修改字段值
user1.Age = 26
user1.Address.City = "广州市"
fmt.Printf("修改后 - 用户: %s, 年龄: %d, 城市: %s\n",
user1.Username, user1.Age, user1.Address.City)
}
匿名嵌套结构体(嵌入结构体):
package main
import "fmt"
type UserProfile struct {
ID int
Username string
Address // 匿名嵌套
}
func main() {
user := UserProfile{
ID: 1001,
Username: "wangwu",
Address: Address{
Province: "浙江省",
City: "杭州市",
},
}
// 可以直接访问嵌套结构体的字段
fmt.Printf("省份: %s, 城市: %s\n", user.Province, user.City)
// 也可以完整路径访问
fmt.Printf("城市: %s\n", user.Address.City)
}
结构体指针:
package main
import "fmt"
func main() {
user := &User{
ID: 1003,
Username: "zhaoliu",
}
// 指针访问结构体字段,自动解引用
fmt.Printf("用户ID: %d, 用户名: %s\n", user.ID, user.Username)
// 明确写法
fmt.Printf("用户名: %s\n", (*user).Username)
}
var声明、字面量、new()函数.访问和修改字段值