Golang中的結(jié)構(gòu)(struct)是一種用戶定義的類型,允許將可能不同類型的項(xiàng)分組/組合成單個(gè)類型。任何現(xiàn)實(shí)世界中擁有一組屬性/字段的實(shí)體都可以表示為結(jié)構(gòu)。這個(gè)概念通常與面向?qū)ο缶幊讨械念愡M(jìn)行比較。它可以被稱為不支持繼承但支持組合的輕量級類。
例如,一個(gè)地址具有name,street,city,state,Pincode。如下所示,將這三個(gè)屬性組合為一個(gè)結(jié)構(gòu)Address是有意義的。
聲明結(jié)構(gòu):
type Address struct { name string street string city string state string Pincode int }
在上面,type關(guān)鍵字引入了一個(gè)新類型。其后是類型的名稱(Address)和關(guān)鍵字struct,以說明我們正在定義結(jié)構(gòu)。該結(jié)構(gòu)包含花括號內(nèi)各個(gè)字段的列表。每個(gè)字段都有一個(gè)名稱和類型。
注意:我們還可以通過組合相同類型的各個(gè)字段來使它們緊湊,如下例所示:
type Address struct { name, street, city, state string Pincode int }
定義結(jié)構(gòu):聲明結(jié)構(gòu)的語法:
var a Address
上面的代碼創(chuàng)建一個(gè)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)(使用此語法時(shí)字段的順序無關(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() { //聲明一個(gè)“struct”類型的變量 //初始化所有struct字段 //其值為零 var a Address fmt.Println(a) //聲明和初始化 // struct使用結(jié)構(gòu)文字 a1 := Address{"Akshay", "Dehradun", 3623572} fmt.Println("Address1: ", a1) //在命名字段時(shí) //初始化一個(gè)結(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)的各個(gè)字段,您必須使用點(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) //賦新值 //指向一個(gè)結(jié)構(gòu)字段 c.Color = "Black" //顯示結(jié)果 fmt.Println("Car: ", c) }
輸出:
Car Name: Ferrari Car Color: Red Car: {Ferrari GTC4 Black 1920}
Golang中的指針是一個(gè)變量,用于存儲(chǔ)另一個(gè)變量的內(nèi)存地址。您還可以創(chuàng)建一個(gè)指向結(jié)構(gòu)的指針,如以下示例所示:
// 指向結(jié)構(gòu)體的指針 package main import "fmt" // 定義一個(gè)結(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" //定義一個(gè)結(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