1. 结构体的声明和初始化
1.1 声明结构体
结构体的声明使用type
关键字:
type Person struct {
Name string
Age int
}
1.2 初始化结构体
可以使用字面值初始化结构体:
p := Person{Name: "Alice", Age: 30}
fmt.Println(p) // 输出: {Alice 30}
也可以省略字段名(但需要按照字段声明的顺序):
p := Person{"Alice", 30}
fmt.Println(p) // 输出: {Alice 30}
对于部分字段初始化,未指定的字段将使用零值:
p := Person{Name: "Bob"}
fmt.Println(p) // 输出: {Bob 0}
2. 访问和修改结构体字段
使用点操作符.
来访问和修改结构体字段:
p := Person{Name: "Alice", Age: 30}
fmt.Println(p.Name) // 输出: Alice
p.Age = 31
fmt.Println(p.Age) // 输出: 31
3. 结构体指针
可以使用结构体的指针来操作结构体:
3.1 获取结构体的指针
使用取地址符号&
:
p := Person{Name: "Alice", Age: 30}
pPtr := &p
3.2 通过指针访问和修改字段
可以直接使用点操作符访问和修改字段,Go会自动解引用:
p := Person{Name: "Alice", Age: 30}
pPtr := &p
pPtr.Age = 31
fmt.Println(p.Age) // 输出: 31
4. 匿名字段和嵌套结构体
4.1 匿名字段
匿名字段使结构体看起来像继承了另一个结构体:
type Address struct {
City, State string
}
type Person struct {
Name string
Age int
Address // 匿名字段
}
p := Person{Name: "Alice", Age: 30, Address: Address{City: "New York", State: "NY"}}
fmt.Println(p.City) // 输出: New York
4.2 嵌套结构体
嵌套结构体是结构体中包含另一个结构体:
type Address struct {
City, State string
}
type Person struct {
Name string
Age int
Address Address
}
p := Person{Name: "Alice", Age: 30, Address: Address{City: "New York", State: "NY"}}
fmt.Println(p.Address.City) // 输出: New York
5. 方法与结构体
可以为结构体定义方法:
5.1 值接收者方法
值接收者方法在方法调用时会复制结构体:
func (p Person) Greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}
p := Person{Name: "Alice", Age: 30}
p.Greet() // 输出: Hello, my name is Alice
5.2 指针接收者方法
指针接收者方法在方法调用时不会复制结构体,可以修改结构体字段:
func (p *Person) UpdateAge(newAge int) {
p.Age = newAge
}
p := Person{Name: "Alice", Age: 30}
p.UpdateAge(31)
fmt.Println(p.Age) // 输出: 31
6. 结构体标签(Tags)
结构体标签常用于与反射相关的操作,如JSON序列化:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
p := Person{Name: "Alice", Age: 30}
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData)) // 输出: {"name":"Alice","age":30}
7. 结构体比较
如果结构体的所有字段都可以比较,则结构体也可以比较:
type Point struct {
X, Y int
}
p1 := Point{X: 1, Y: 2}
p2 := Point{X: 1, Y: 2}
fmt.Println(p1 == p2) // 输出: true
8. 结构体的零值
结构体的零值是每个字段都是该字段类型的零值:
var p Person
fmt.Println(p) // 输出: { 0 { 0}}
9. 使用构造函数创建结构体
可以定义一个函数来创建和初始化结构体:
func NewPerson(name string, age int) Person {
return Person{Name: name, Age: age}
}
p := NewPerson("Alice", 30)
fmt.Println(p) // 输出: {Alice 30}
版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:http://example.com/subject/article/83/
许可协议:署名-非商业性使用 4.0 国际许可协议