Golang中的結(jié)構(gòu)(struct)是一種用戶定義的類型,允許將可能不同類型的項(xiàng)分組/組合成單個類型。任何現(xiàn)實(shí)世界中擁有一組屬性/字段的實(shí)體都可以表示為結(jié)構(gòu)。這個概念通常與面向?qū)ο缶幊讨械念愡M(jìn)行比較。它可以被稱為不支持繼承但支持組合的輕量級類。
例如,一個地址具有name,street,city,state,Pincode。如下所示,將這三個屬性組合為一個結(jié)構(gòu)Address是有意義的。
聲明結(jié)構(gòu):
type Address struct {
name string
street string
city string
state string
Pincode int
}在上面,type關(guān)鍵字引入了一個新類型。其后是類型的名稱(Address)和關(guān)鍵字struct,以說明我們正在定義結(jié)構(gòu)。該結(jié)構(gòu)包含花括號內(nèi)各個字段的列表。每個字段都有一個名稱和類型。
注意:我們還可以通過組合相同類型的各個字段來使它們緊湊,如下例所示:
type Address struct {
name, street, city, state string
Pincode int
}定義結(jié)構(gòu):聲明結(jié)構(gòu)的語法:
var a Address
上面的代碼創(chuàng)建一個Address類型的變量,默認(rèn)情況下將其設(shè)置為零。對于結(jié)構(gòu),零表示所有字段均設(shè)置為其對應(yīng)的零值。因此,字段name,street,city,state都設(shè)置為“”,而Pincode設(shè)置為0。
您還可以使用結(jié)構(gòu)字面量來初始化結(jié)構(gòu)類型的變量,如下所示:
var a = Address{"Akshay", "PremNagar", "Dehradun", "Uttarakhand", 252636}注意:
始終以在結(jié)構(gòu)中聲明它們的順序傳遞字段值。同樣,您不能僅使用上述語法初始化字段的子集。
Go還支持名稱:value語法,用于初始化結(jié)構(gòu)(使用此語法時字段的順序無關(guān)緊要)。而且,這僅允許您初始化字段的子集。所有未初始化的字段均設(shè)置為其相應(yīng)的零值。
例如:
var a = Address{"Akshay", "PremNagar", "Dehradun", "Uttarakhand", 252636}package main
import "fmt"
//定義結(jié)構(gòu)類型
type Address struct {
Name string
city string
Pincode int
}
func main() {
//聲明一個“struct”類型的變量
//初始化所有struct字段
//其值為零
var a Address
fmt.Println(a)
//聲明和初始化
// struct使用結(jié)構(gòu)文字
a1 := Address{"Akshay", "Dehradun", 3623572}
fmt.Println("Address1: ", a1)
//在命名字段時
//初始化一個結(jié)構(gòu)
a2 := Address{Name: "Anikaa", city: "Ballia",Pincode: 277001}
fmt.Println("Address2: ", a2)
//未初始化的字段設(shè)置為
//它們對應(yīng)的零值
a3 := Address{Name: "Delhi"}
fmt.Println("Address3: ", a3)
}輸出:
{ 0}
Address1: {Akshay Dehradun 3623572}
Address2: {Anikaa Ballia 277001}
Address3: {Delhi 0}要訪問結(jié)構(gòu)的各個字段,您必須使用點(diǎn)(.)運(yùn)算符。
package main
import "fmt"
//定義結(jié)構(gòu)體
type Car struct {
Name, Model, Color string
WeightInKg float64
}
func main() {
c := Car{Name: "Ferrari", Model: "GTC4", Color: "Red", WeightInKg: 1920}
//訪問結(jié)構(gòu)字段
//使用點(diǎn)運(yùn)算符
fmt.Println("Car Name: ", c.Name)
fmt.Println("Car Color: ", c.Color)
//賦新值
//指向一個結(jié)構(gòu)字段
c.Color = "Black"
//顯示結(jié)果
fmt.Println("Car: ", c)
}輸出:
Car Name: Ferrari
Car Color: Red
Car: {Ferrari GTC4 Black 1920}Golang中的指針是一個變量,用于存儲另一個變量的內(nèi)存地址。您還可以創(chuàng)建一個指向結(jié)構(gòu)的指針,如以下示例所示:
// 指向結(jié)構(gòu)體的指針
package main
import "fmt"
// 定義一個結(jié)構(gòu)
type Employee struct {
firstName, lastName string
age, salary int
}
func main() {
//傳遞struct變量的地址
// emp8是指向Employee結(jié)構(gòu)的指針
emp8 := &Employee{"Sam", "Anderson", 55, 6000}
//(* emp8).firstName是要訪問的語法
// emp8結(jié)構(gòu)的firstName字段
fmt.Println("First Name:", (*emp8).firstName)
fmt.Println("Age:", (*emp8).age)
}輸出:
First Name: Sam Age: 55
Golang為我們提供了使用emp8.firstName而不是顯式解引用(* emp8).firstName來訪問firstName字段的選項(xiàng)。 顯示此示例如下:
//指向結(jié)構(gòu)的指針
package main
import "fmt"
//定義一個結(jié)構(gòu)
type Employee struct {
firstName, lastName string
age, salary int
}
func main() {
//獲取指向結(jié)構(gòu)體的指針
emp8 := &Employee{"Sam", "Anderson", 55, 6000}
// emp8.firstName用于訪問
//字段firstName
fmt.Println("First Name: ", emp8.firstName)
fmt.Println("Age: ", emp8.age)
}輸出:
First Name: Sam Age: 55