Go结构体
Go结构体将多个字段组合为自定义类型,是面向对象的基础。
结构体定义
基本语法
Go
// 定义结构体
type User struct {
Name string
Age int
Active bool
}
// 使用结构体
var u User
u.Name = "Tom"
u.Age = 25
字段类型
Go
type Person struct {
Name string
Age int
Email string
Scores []int // slice字段
Tags map[string]bool // map字段
Parent *Person // 指针字段(自引用)
}
结构体初始化
指定字段名
Go
u := User{
Name: "Tom",
Age: 25,
Active: true,
}
// 部分字段初始化(其他零值)
u := User{Name: "Tom"} // Age=0, Active=false
按顺序初始化
Go
// 按字段顺序(必须全部)
u := User{"Tom", 25, true}
// 部分必须用字段名
u := User{"Tom"} // 编译错误!缺少字段
推荐使用字段名初始化,清晰且可省略字段。
零值初始化
Go
var u User // 所有字段零值
// Name="", Age=0, Active=false
// new创建指针
u := new(User) // 返回*User,字段零值
字段访问
直接访问
Go
u := User{Name: "Tom", Age: 25}
// 访问字段
fmt.Println(u.Name) // Tom
fmt.Println(u.Age) // 25
// 修改字段
u.Age = 30
指针访问
Go
u := &User{Name: "Tom"}
// 指针直接访问(自动解引用)
fmt.Println(u.Name) // Tom(自动解引用)
u.Age = 25 // 自动解引用
// 显式解引用
fmt.Println((*u).Name) // 等价于u.Name
结构体方法
方法定义
Go
type User struct {
Name string
Age int
}
// 值接收者方法
func (u User) GetName() string {
return u.Name
}
// 指针接收者方法(可修改)
func (u *User) SetAge(age int) {
u.Age = age
}
方法调用
Go
u := User{Name: "Tom", Age: 25}
// 调用方法
name := u.GetName()
fmt.Println(name) // Tom
u.SetAge(30)
fmt.Println(u.Age) // 30
结构体嵌套(组合)
字段嵌套
Go
type Address struct {
City string
Street string
}
type User struct {
Name string
Address Address // 嵌套结构体
}
u := User{
Name: "Tom",
Address: Address{City: "北京", Street: "长安街"},
}
// 访问嵌套字段
fmt.Println(u.Address.City)
匿名嵌套(继承效果)
Go
type User struct {
Name string
Address // 匿名嵌套
}
u := User{
Name: "Tom",
Address: Address{City: "北京"},
}
// 直接访问嵌套字段(继承效果)
fmt.Println(u.City) // 直接访问
fmt.Println(u.Address.City) // 或通过字段名
结构体可见性
字段导出规则
Go
type User struct {
Name string // 大写,可导出
age int // 小写,不可导出(私有)
Email string // 大写,可导出
}
// 外部包只能访问Name和Email
// 不能访问age
首字母大写字段可导出,小写私有。
结构体初始化对比
| 方式 | 示例 | 说明 |
|---|---|---|
| 零值 | var u User | 字段全部零值 |
| 字段名 | User{Name:"Tom"} | 推荐,可省略字段 |
| 按顺序 | User{"Tom",25} | 必须全部字段 |
| new | new(User) | 返回指针 |
| 指针 | &User{Name:"Tom"} | 返回指针 |
要点总结
- type struct定义结构体
- 字段名初始化推荐,清晰可省略
- 部分字段初始化其他自动零值
- 指针访问自动解引用
- 值接收者方法不修改原值
- 指针接收者方法可修改原值
- 匿名嵌套实现继承效果
- 大写字段可导出,小写私有
📝 发现内容有误?点击此处直接编辑