Golang学习笔记_09——if条件判断
Golang学习笔记_10——Switch
Golang学习笔记_11——指针
文章目录
- 结构体
- 1. 定义
- 2. 访问 && 修改
- 3. 零值初始化 & 使用指针初始化
- 4. 匿名字段和嵌套结构体
- 5. 结构体方法和接收者
- 源码
结构体
Go语言中的结构体(struct)是一种复合数据类型,它允许你将多个不同类型的变量组合在一起。结构体在Go语言中非常常用,因为它提供了一种组织数据的强大方式,使代码更加清晰和模块化。
一个 结构体(struct
)就是一组 字段(field)。
1. 定义
type Person struct {
Name string
Age int
Status string
}
func StructDemo() {
p1 := Person{
Name: "tom",
Age: 20,
Status: "ok",
}
p2 := Person{"Alice", 30, "Error"}
fmt.Println(p1, p2) // 不用会报异常,简单打印下
}
2. 访问 && 修改
我们定义了一个名为Person
的结构体,它有三个字段:Name
(字符串类型)、Age
(整型)和City
(字符串类型)。通过点操作符(.
)可以访问和修改这些字段的值。
func StructDemo2() {
p := Person{
Name: "tom",
Age: 20,
Status: "ok",
}
fmt.Printf("Name: %s, Age: %d, Status: %s\n", p.Name, p.Age, p.Status)
p.Status = "error"
fmt.Printf("after fixed, Name: %s, Age: %d, Status: %s\n", p.Name, p.Age, p.Status)
}
测试方法
func TestStructDemo2(t *testing.T) {
StructDemo2()
}
输出结果
=== RUN TestStructDemo2
Name: tom, Age: 20, Status: ok
after fixed, Name: tom, Age: 20, Status: error
--- PASS: TestStructDemo2 (0.00s)
PASS
3. 零值初始化 & 使用指针初始化
func StructDemo3() {
// 零值初始化
var p3 Person
var p4 = &Person{"Alice", 30, "ok"}
fmt.Printf("Name: %s, Age: %d, Status: %s\n", p3.Name, p3.Age, p3.Status)
fmt.Printf("Name: %s, Age: %d, Status: %s\n", p4.Name, p4.Age, p4.Status)
}
4. 匿名字段和嵌套结构体
type Address struct {
Street string
City string
}
type Employee struct {
Name string
Age int
Address // 匿名字段
}
func structDemo4() {
e := Employee{
Name: "Bob",
Age: 40,
Address: Address{
Street: "123 Main St",
City: "San Francisco",
},
}
// 访问嵌套结构体的字段
fmt.Printf("Employee Name: %s\n", e.Name)
fmt.Printf("Street: %s\n", e.Street) // 直接访问匿名字段中的字段
}
测试方法
func Test_structDemo4(t *testing.T) {
structDemo4()
}
输出结果
=== RUN Test_structDemo4
Employee Name: Bob
Street: 123 Main St
--- PASS: Test_structDemo4 (0.00s)
PASS
5. 结构体方法和接收者
Go语言允许为结构体定义方法。方法是与特定类型(通常是结构体类型)绑定的函数。定义方法时,需要在函数签名前加上该类型的接收者。接收者可以是值接收者(方法接收一个类型的值)或指针接收者(方法接收一个类型的指针)。
type Rectangle struct {
Width, Height float64
}
// 值接收者方法
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// 指针接收者方法(修改结构体的值)
func (r *Rectangle) Scale(factor float64) {
r.Width *= factor
r.Height *= factor
}
func StructDemo5() {
r := Rectangle{Width: 3, Height: 4}
fmt.Println("Area:", r.Area())
r.Scale(2)
fmt.Println("Scaled Area:", r.Area())
}
测试方法
func TestStructDemo5(t *testing.T) {
StructDemo5()
}
输出结果
=== RUN TestStructDemo5
Area: 12
Scaled Area: 48
--- PASS: TestStructDemo5 (0.00s)
PASS
源码
// struct_demo.go 文件
package struct_demo
import "fmt"
type Person struct {
Name string
Age int
Status string
}
func StructDemo() {
p1 := Person{
Name: "tom",
Age: 20,
Status: "ok",
}
p2 := Person{"Alice", 30, "ok"}
fmt.Println(p1, p2)
}
func StructDemo2() {
p := Person{
Name: "tom",
Age: 20,
Status: "ok",
}
fmt.Printf("Name: %s, Age: %d, Status: %s\n", p.Name, p.Age, p.Status)
p.Status = "error"
fmt.Printf("after fixed, Name: %s, Age: %d, Status: %s\n", p.Name, p.Age, p.Status)
}
func StructDemo3() {
// 零值初始化
var p3 Person
var p4 = &Person{"Alice", 30, "ok"}
fmt.Printf("Name: %s, Age: %d, Status: %s\n", p3.Name, p3.Age, p3.Status)
fmt.Printf("Name: %s, Age: %d, Status: %s\n", p4.Name, p4.Age, p4.Status)
}
// struct_demo_test.go 文件
package struct_demo
import "testing"
func TestStructDemo(t *testing.T) {
StructDemo()
}
func TestStructDemo2(t *testing.T) {
StructDemo2()
}
// struct_demo2.go 文件
package struct_demo
import "fmt"
type Address struct {
Street string
City string
}
type Employee struct {
Name string
Age int
Address // 匿名字段
}
func structDemo4() {
e := Employee{
Name: "Bob",
Age: 40,
Address: Address{
Street: "123 Main St",
City: "San Francisco",
},
}
// 访问嵌套结构体的字段
fmt.Printf("Employee Name: %s\n", e.Name)
fmt.Printf("Street: %s\n", e.Street) // 直接访问匿名字段中的字段
}
// struct_demo2_test.go 文件
package struct_demo
import "testing"
func Test_structDemo4(t *testing.T) {
structDemo4()
}
// struct_demo3.go 文件
package struct_demo
import "fmt"
type Rectangle struct {
Width, Height float64
}
// 值接收者方法
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// 指针接收者方法(修改结构体的值)
func (r *Rectangle) Scale(factor float64) {
r.Width *= factor
r.Height *= factor
}
func StructDemo5() {
r := Rectangle{Width: 3, Height: 4}
fmt.Println("Area:", r.Area())
r.Scale(2)
fmt.Println("Scaled Area:", r.Area())
}
// struct_demo3_test.go
package struct_demo
import "testing"
func TestStructDemo5(t *testing.T) {
StructDemo5()
}