Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧分享
組合結(jié)構(gòu)體
Go語(yǔ)言中的結(jié)構(gòu)體也可以通過(guò)組合來(lái)實(shí)現(xiàn)復(fù)用的功能,具體實(shí)現(xiàn)方法如下:
type Person struct { Name string Age int } type Student struct { P Person // 組合了Person結(jié)構(gòu)體 School string } func main() { s := Student{Person{"Tom", 18}, "High School"} fmt.Println(s.P.Name, s.P.Age, s.School) // 輸出 Tom 18 High School }
這段代碼中定義了一個(gè)Person結(jié)構(gòu)體,包含Name和Age兩個(gè)字段,另外定義了一個(gè)Student結(jié)構(gòu)體,它組合了Person結(jié)構(gòu)體。在main函數(shù)中,我們通過(guò)構(gòu)造函數(shù)創(chuàng)建了一個(gè)Student實(shí)例s,并訪問(wèn)了它的Name、Age和School字段,需要通過(guò)s.P來(lái)訪問(wèn)Person結(jié)構(gòu)體中的字段。
通過(guò)組合其他結(jié)構(gòu)體,子結(jié)構(gòu)體可以復(fù)用父結(jié)構(gòu)體中的字段和方法,但是它不會(huì)繼承父結(jié)構(gòu)體的特性和行為。與繼承相比,組合更加靈活和簡(jiǎn)單,但也需要開(kāi)發(fā)者更多的手動(dòng)操作。
需要注意的是,Go語(yǔ)言中沒(méi)有類(lèi)的概念,因此結(jié)構(gòu)體不是類(lèi),它不能實(shí)現(xiàn)繼承和多態(tài)等面向?qū)ο蟮奶匦裕且环N數(shù)據(jù)類(lèi)型的定義方式。
嵌套結(jié)構(gòu)體
可以在結(jié)構(gòu)體中嵌套另一個(gè)結(jié)構(gòu)體,從而形成一個(gè)復(fù)合的結(jié)構(gòu)體類(lèi)型。嵌套結(jié)構(gòu)體可以直接使用內(nèi)部結(jié)構(gòu)體的字段,也可以通過(guò)內(nèi)部結(jié)構(gòu)體名來(lái)訪問(wèn)內(nèi)部結(jié)構(gòu)體的字段。
例如:
type Address struct { Province string City string } type Person struct { Name string Age int Address Address } p := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Chaoyang"}} fmt.Println(p.Name, p.Age, p.Address.Province, p.Address.City)
指針結(jié)構(gòu)體
結(jié)構(gòu)體變量通常會(huì)占用比較大的內(nèi)存空間,為了節(jié)省內(nèi)存,可以使用指針結(jié)構(gòu)體。指針結(jié)構(gòu)體可以通過(guò)&操作符獲取結(jié)構(gòu)體變量的地址,并通過(guò)*操作符訪問(wèn)結(jié)構(gòu)體變量的值。
例如:
type Person struct { Name string Age int } p := &Person{Name: "Tom", Age: 18} fmt.Println((*p).Name, (*p).Age) // 輸出:Tom 18 fmt.Println(p.Name, p.Age) // 輸出:Tom 18
匿名字段
可以將一個(gè)結(jié)構(gòu)體類(lèi)型作為另一個(gè)結(jié)構(gòu)體類(lèi)型的字段,這個(gè)字段就稱為匿名字段。匿名字段的類(lèi)型可以是任意類(lèi)型,可以是基本類(lèi)型、結(jié)構(gòu)體類(lèi)型、指針類(lèi)型等。匿名字段可以直接訪問(wèn)內(nèi)部結(jié)構(gòu)體的字段,也可以通過(guò)內(nèi)部結(jié)構(gòu)體名來(lái)訪問(wèn)內(nèi)部結(jié)構(gòu)體的字段。
例如:
type Address struct { Province string City string } type Person struct { Name string Age int Address } p := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Chaoyang"}} fmt.Println(p.Name, p.Age, p.Province, p.City)
面向?qū)ο?/h2>
Go語(yǔ)言雖然不是一種純面向?qū)ο缶幊陶Z(yǔ)言,但它提供了一些面向?qū)ο缶幊痰幕咎匦?,比如封裝、繼承和多態(tài)等。
封裝
Go語(yǔ)言通過(guò)大寫(xiě)字母開(kāi)頭的字段或方法來(lái)實(shí)現(xiàn)封裝,這些字段或方法可以在包外部訪問(wèn)。小寫(xiě)字母開(kāi)頭的字段或方法則只能在當(dāng)前包內(nèi)部訪問(wèn)。
例如:
package main import "fmt" type Person struct { name string age int } func (p *Person) SayHello() { fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.") } func main() { p := &Person{"Tom", 18} p.SayHello() }
在上面的代碼中,我們定義了一個(gè)名為Person的結(jié)構(gòu)體,它有兩個(gè)字段name和age,并且定義了一個(gè)方法SayHello,用于打印個(gè)人信息。在main函數(shù)中,我們創(chuàng)建了一個(gè)Person對(duì)象p,并調(diào)用它的SayHello方法,輸出了它的信息。
繼承
Go語(yǔ)言不支持傳統(tǒng)的繼承方式,但是可以通過(guò)結(jié)構(gòu)體組合的方式實(shí)現(xiàn)繼承。具體來(lái)說(shuō),我們可以在一個(gè)結(jié)構(gòu)體中包含另一個(gè)結(jié)構(gòu)體,并通過(guò)嵌套結(jié)構(gòu)體的方式來(lái)繼承其字段和方法。
例如:
package main import "fmt" type Person struct { name string age int } func (p *Person) SayHello() { fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.") } type Student struct { Person score int } func main() { s := &Student{Person{"Tom", 18}, 90} s.SayHello() fmt.Println("My score is", s.score) }
在上面的代碼中,我們定義了兩個(gè)結(jié)構(gòu)體Person和Student,Student結(jié)構(gòu)體包含了一個(gè)Person類(lèi)型的字段,并且定義了一個(gè)自己的score字段。在main函數(shù)中,我們創(chuàng)建了一個(gè)Student對(duì)象s,并調(diào)用它的SayHello方法,輸出了它的信息,然后輸出了它的成績(jī)。
多態(tài)
Go語(yǔ)言不支持傳統(tǒng)的多態(tài)方式,但是可以通過(guò)接口實(shí)現(xiàn)多態(tài)。具體來(lái)說(shuō),我們可以定義一個(gè)接口,并讓不同的結(jié)構(gòu)體實(shí)現(xiàn)這個(gè)接口,從而實(shí)現(xiàn)多態(tài)。
例如:
package main import "fmt" type Animal interface { Say() } type Cat struct{} func (c *Cat) Say() { fmt.Println("Meow!") } type Dog struct{} func (d *Dog) Say() { fmt.Println("Woof!") } func main() { var a Animal a = &Cat{} a.Say() a = &Dog{} a.Say() }
這段Go語(yǔ)言代碼定義了一個(gè)Animal接口和兩個(gè)實(shí)現(xiàn)了該接口的結(jié)構(gòu)體:Cat和Dog。Animal接口中只有一個(gè)Say()方法。Cat和Dog分別實(shí)現(xiàn)了Say()方法并輸出相應(yīng)的聲音。在main函數(shù)中,定義了一個(gè)a變量,類(lèi)型為Animal接口。首先將a賦值為一個(gè)Cat結(jié)構(gòu)體的指針,然后調(diào)用a的Say()方法輸出"Meow!"。接著將a賦值為一個(gè)Dog結(jié)構(gòu)體的指針,再次調(diào)用a的Say()方法輸出"Woof!"。
到此這篇關(guān)于Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧分享的文章就介紹到這了,更多相關(guān)Go結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片
- go語(yǔ)言中結(jié)構(gòu)體tag使用小結(jié)
- Golang?中判斷兩個(gè)結(jié)構(gòu)體相等的方法
- Go中匿名結(jié)構(gòu)體的使用技巧
- 詳解Golang time包中的結(jié)構(gòu)體time.Ticker
- 詳解Golang time包中的結(jié)構(gòu)體time.Time
- 詳解Go語(yǔ)言中的結(jié)構(gòu)體的特性
- 一文帶你感受Go語(yǔ)言空結(jié)構(gòu)體的魔力
- 細(xì)說(shuō)Go語(yǔ)言中空結(jié)構(gòu)體的奇妙用途
- 一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
- 深入理解Go語(yǔ)言中的結(jié)構(gòu)體
相關(guān)文章
一文帶你掌握Golang中的值類(lèi)型和引用類(lèi)型
在?Golang?中,數(shù)據(jù)類(lèi)型可以分為兩大類(lèi):值類(lèi)型(Value?Types)和引用類(lèi)型(Reference?Types),理解這兩種類(lèi)型的區(qū)別對(duì)于理解?Golang?中的數(shù)據(jù)傳遞和內(nèi)存管理是很重要的,下面就跟隨小編一起深入了解一下它們吧2024-01-01Go語(yǔ)言Grpc?Stream的實(shí)現(xiàn)
本文主要介紹了Go語(yǔ)言Grpc?Stream的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06go同步原語(yǔ)Phaser和Barrier區(qū)別
這篇文章主要為大家介紹了通過(guò)java講解go同步原語(yǔ)Phaser和Barrier區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12