在 Go 語言(Golang)中,結(jié)構(gòu)體(Struct)是一種復(fù)合數(shù)據(jù)類型,它允許你將零個(gè)或多個(gè)不同類型的命名項(xiàng)組合成一個(gè)單一的類型。結(jié)構(gòu)體是一種非常靈活的數(shù)據(jù)表示方式,常用于表示具有多個(gè)屬性的復(fù)雜對象。
你可以使用 type
關(guān)鍵字和 struct
關(guān)鍵字來聲明一個(gè)結(jié)構(gòu)體。結(jié)構(gòu)體中的每個(gè)項(xiàng)稱為字段(Field),字段之間使用分號(;
)或換行符來分隔(在 Go 中,通常使用換行符來分隔字段)。
type Person struct {
Name string
Age int
Email string
}
在這個(gè)例子中,Person
是一個(gè)結(jié)構(gòu)體類型,它有三個(gè)字段:Name
(字符串類型)、Age
(整型)和 Email
(字符串類型)。
有幾種方法可以初始化結(jié)構(gòu)體變量:
p := Person{
Name: "John Doe",
Age: 30,
Email: "john.doe@example.com",
}
p := Person{"John Doe", 30, "john.doe@example.com"}
但請注意,這種方法依賴于字段的聲明順序,如果將來結(jié)構(gòu)體定義發(fā)生變化,這種初始化方式可能會引入錯(cuò)誤。
new
關(guān)鍵字(不常用,因?yàn)樗环峙淞藘?nèi)存,并返回了指向零值的指針):p := new(Person)
p.Name = "John Doe"
p.Age = 30
p.Email = "john.doe@example.com"
你可以通過點(diǎn)(.
)操作符來訪問結(jié)構(gòu)體變量的字段。
fmt.Println(p.Name) // 輸出: John Doe
在 Go 中,你經(jīng)常會看到結(jié)構(gòu)體通過指針來傳遞和訪問。這樣做的好處是可以避免在函數(shù)之間傳遞大型結(jié)構(gòu)體時(shí)的數(shù)據(jù)復(fù)制開銷,并且可以直接修改結(jié)構(gòu)體中的字段。
func modifyPerson(p *Person) {
p.Age = 31
}
func main() {
p := Person{Name: "John Doe", Age: 30, Email: "john.doe@example.com"}
modifyPerson(&p)
fmt.Println(p.Age) // 輸出: 31
}
在這個(gè)例子中,modifyPerson
函數(shù)接收一個(gè)指向 Person
結(jié)構(gòu)體的指針作為參數(shù),并修改了結(jié)構(gòu)體中的 Age
字段。由于 p
在 main
函數(shù)中是通過 &p
(即 p
的地址)傳遞給 modifyPerson
的,因此 main
函數(shù)中的 p
也會看到 Age
字段的修改。
Go 語言允許你在一個(gè)結(jié)構(gòu)體中嵌套另一個(gè)結(jié)構(gòu)體作為字段。
type Address struct {
City, State string
}
type Person struct {
Name string
Age int
Address Address
}
在這個(gè)例子中,Person
結(jié)構(gòu)體包含一個(gè) Address
類型的字段,這允許你將 Address
結(jié)構(gòu)體作為 Person
結(jié)構(gòu)體的一部分來組織和訪問數(shù)據(jù)。
上一篇: Golang 語言指針
下一篇: Golang 語言切片(Slice)