【go从零单排】go中的结构体struct和method
Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
概念
struct
在Go语言中,结构体(struct)是一种用户定义的数据类型,用于将相关的数据组合在一起。
结构体可以包含多个字段,每个字段可以具有不同的数据类型。
结构体是Go语言中组织和管理数据的基本方式之一。
代码
struct
package main
import "fmt"
// 在代码中定义了一个名为 person 的结构体,包含两个字段:name(字符串类型)和 age(整数类型)
type person struct {
name string
age int
}
// 定义构造函数newPerson,输入一个string,输出person结构体的指针
func newPerson(name string) *person {
//定义变量,把person的name字段设置为传入的name,赋值给p
p := person{name: name}
p.age = 42 //p的age设置为42
return &p //返回p的内存地址
}
func main() {
//创建一个新的结构,按位置赋值
fmt.Println(person{"Bob", 20})
//创建一个新的结构,按字段名称赋值
fmt.Println(person{name: "Alice", age: 30})
//只赋值name,age不赋值时会被初始化为0
fmt.Println(person{name: "Fred"})
//用&表示指针,打印结果带有&
fmt.Println(&person{name: "Ann", age: 40})
//在构造函数中初始化结构
fmt.Println(newPerson("Jon"))
//使用.name访问结构体字段
s := person{name: "Sean", age: 50}
fmt.Println(s.name)
//把.与结构体指针一起使用,指针会自动取消引用,这里会输出age的值
sp := &s
fmt.Println(sp.age)
//结构体是可变的,这里改变age的值
sp.age = 51
fmt.Println(sp.age)
//创建dog结构体,字段为name string类型,isGood 布尔类型
//注意这里省略了type,直接用dog并赋值
dog := struct {
name string
isGood bool
}{
"Rex",
true,
}
//上面的代码为匿名结构体,临时使用一次或者测试时用
fmt.Println(dog)
}
method
package main
import "fmt"
// 定义结构体
type rect struct {
width, height int
}
// 定义方法area,输入为指向rect结构体的指针,输出一个int
func (r *rect) area() int {
return r.width * r.height //计算面积
}
// 注意看这里没有*,输入为rect结构体
func (r rect) perim() int {
return 2*r.width + 2*r.height //计算周长perim
}
func main() {
//给结构体r赋值
r := rect{width: 10, height: 5}
fmt.Println("area: ", r.area())
fmt.Println("perim:", r.perim())
//变量rp赋值为指向r的指针,这样做可以避免改变r的结构体
rp := &r
fmt.Println("area: ", rp.area())
fmt.Println("perim:", rp.perim())
}
嵌套struct
package main
import "fmt"
// 定义address结构体
type Address struct {
City string
State string
ZipCode string
}
// 定义person结构体,嵌套了address
type Person struct {
Name string
Age int
Address Address // 嵌套结构体
}
func main() {
person := Person{
Name: "David",
Age: 40,
//这里可以直接使用嵌套的结构
Address: Address{
City: "New York",
State: "NY",
ZipCode: "10001",
},
}
fmt.Println(person.Address.City) // 输出: New York
}
理解
- 结构体的定义使用 type 关键字,后跟结构体名称和字段的定义。字段的定义包括字段名和字段类型。
- 如果结构体只有一次使用,比如测试时,可以不给结构体名称,直接赋值
- 通过点(.)操作符访问结构体的字段
- go支持在结构类型上定义method,意味着可以使用创建的结构体作为输入/输出
- 可以使用嵌套struct
无人扶我青云志,我自踏雪至山巅。