Go語(yǔ)言的匿名字段實(shí)現(xiàn)組合復(fù)用實(shí)例探究
1、定義
Go語(yǔ)言支持一種特殊的字段只需要提供類型而不需要寫字段名的字段,稱之為匿名字段或者嵌套字段。
所謂匿名字段實(shí)際上是一種結(jié)構(gòu)體嵌套的方式,所以也可以稱作嵌套字段。
這種方式可以實(shí)現(xiàn)組合復(fù)用,即通過(guò)匿名字段,結(jié)構(gòu)體可以直接訪問(wèn)嵌套結(jié)構(gòu)體的字段和方法,而無(wú)需通過(guò)字段名或類型進(jìn)行嵌套。
2、簡(jiǎn)單示例
以下是一個(gè)簡(jiǎn)單的例子:
// 人
type Person struct {
Name string
Phone string
}
// 打籃球
func (p *Person) playBasketball() {
fmt.Println("打籃球...")
}
// 聯(lián)系方式
type Contact struct {
Phone string
}
// 員工
type Employee struct {
Person
EmployeeId int
}
// 測(cè)試匿名字段
func TestAnonymous(t *testing.T) {
emp := Employee{
Person: Person{
Name: "baily",
Phone: "18899999999",
},
EmployeeId: 1,
}
// 可直接使用emp調(diào)用嵌套類型的方法
emp.playBasketball()
fmt.Println("id: ", emp.EmployeeId)
// 可直接使用emp打印出嵌套類型的所有字段
fmt.Println("name: " + emp.Name)
fmt.Println("name: " + emp.Phone)
}
3、嵌套類型有重復(fù)字段
在上面的例子中,Employee 結(jié)構(gòu)體嵌套了 Person 結(jié)構(gòu)體,通過(guò)這種方式,Employee 可以直接訪問(wèn) Person 的字段和方法,而無(wú)需使用類似 emp.Person.Name這樣的方式。
需要注意的是,如果結(jié)構(gòu)體中有多個(gè) 匿名字段,并且它們擁有相同的字段名,那么在訪問(wèn)這個(gè)同名字段時(shí),需要指定嵌套結(jié)構(gòu)體的類型,以避免歧義。例如:
// 人
type Person struct {
Name string
Phone string
}
// 打籃球
func (p *Person) playBasketball() {
fmt.Println("Person打籃球...")
}
// 聯(lián)系方式
type Contact struct {
Phone string
}
func (c Contact) playBasketball() {
fmt.Println("Contact打籃球...")
}
// 員工
type Employee struct {
Person
EmployeeId int
Contact
}
// 測(cè)試匿名字段
func TestAnonymous(t *testing.T) {
emp := Employee{
Person: Person{
Name: "baily",
Phone: "18899999999",
},
EmployeeId: 1,
Contact: Contact{
Phone: "16611111111",
},
}
// 可直接使用emp調(diào)用出嵌入類型的方法
// 多個(gè)嵌入類型的方法名相同時(shí),需要指定匿名字段的類型
//emp.playBasketball() // 這里就會(huì)報(bào)錯(cuò)
emp.Person.playBasketball()
emp.Contact.playBasketball()
// 可直接使用emp打印出嵌入類型的所有字段
fmt.Println("id: ", emp.EmployeeId)
fmt.Println("name: " + emp.Name)
// 多個(gè)嵌入類型的字段名相同時(shí),需要指定匿名字段的類型
//fmt.Println("name: " + emp.Phone) // 這里就會(huì)報(bào)錯(cuò)
fmt.Println("name: " + emp.Person.Phone)
fmt.Println("name: " + emp.Contact.Phone)
}在這個(gè)例子中,Person 和 Contact 都有 Phone 字段,因此在訪問(wèn)時(shí)需要指定具體的類型以避免歧義。
同樣的,Person 和 Contact 都有 playbasketball 方法,因此在訪問(wèn)時(shí)也需要指定具體的類型以避免歧義。
如果不指定則會(huì)編譯報(bào)錯(cuò),如下:

總結(jié)
Go語(yǔ)言支持匿名字段或者嵌套字段,通過(guò)這種方式可以直接訪問(wèn)嵌套結(jié)構(gòu)體的字段和方法。
在多個(gè)嵌套類型場(chǎng)景下,如果多個(gè)嵌套類型存在相同的字段或者方法,則需要指定具體的類型以避免歧義。
以上就是Go語(yǔ)言的匿名字段實(shí)現(xiàn)組合復(fù)用實(shí)例探究的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言匿名字段的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一篇文章讀懂Golang?init函數(shù)執(zhí)行順序
init()函數(shù)會(huì)在包被初始化后自動(dòng)執(zhí)行,并且在main()函數(shù)之前執(zhí)行,但是需要注意的是init()以及main()函數(shù)都是無(wú)法被顯式調(diào)用的,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章讀懂Golang?init函數(shù)執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下2022-11-11
Go并發(fā)編程避坑指南之如何徹底解決死鎖Deadlock問(wèn)題
在Go語(yǔ)言的并發(fā)編程中,死鎖(Deadlock)是一種極其隱蔽且致命的錯(cuò)誤,本文將帶你深入剖析死鎖的成因,并結(jié)合 sync 包與 context 包,提供一套行之有效的解決方案,希望對(duì)大家有所幫助2026-04-04
GO語(yǔ)言判斷一個(gè)網(wǎng)段是否屬于另一個(gè)網(wǎng)段的子網(wǎng)
這篇文章主要介紹了GO語(yǔ)言判斷一個(gè)網(wǎng)段是否屬于另一個(gè)網(wǎng)段的子網(wǎng)的相關(guān)資料,內(nèi)容介紹詳細(xì),具有一定的參考價(jià)值,需要的朋友可任意參考一下2022-03-03
golang實(shí)現(xiàn)對(duì)JavaScript代碼混淆
在Go語(yǔ)言中,你可以使用一些工具來(lái)混淆JavaScript代碼,一個(gè)常用的工具是Terser,它可以用于壓縮和混淆JavaScript代碼,你可以通過(guò)Go語(yǔ)言的`os/exec`包來(lái)調(diào)用Terser工具,本文給通過(guò)一個(gè)簡(jiǎn)單的示例給大家介紹一下,感興趣的朋友可以參考下2024-01-01
Golang Http請(qǐng)求返回結(jié)果處理
本文主要介紹了Golang Http請(qǐng)求返回結(jié)果處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Go語(yǔ)言 channel如何實(shí)現(xiàn)歸并排序中的merge函數(shù)詳解
這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言 channel如何實(shí)現(xiàn)歸并排序中merge函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02
基于Go語(yǔ)言實(shí)現(xiàn)高性能文件上傳下載系統(tǒng)
在Web應(yīng)用開(kāi)發(fā)中,文件上傳下載是一個(gè)非常常見(jiàn)的需求,本文將介紹如何使用Go語(yǔ)言實(shí)現(xiàn)一個(gè)安全、高效的本地文件存儲(chǔ)系統(tǒng),感興趣的小伙伴可以了解下2025-03-03
golang?recover函數(shù)使用中的一些坑解析
這篇文章主要為大家介紹了golang?recover函數(shù)使用中的一些坑解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
go語(yǔ)言fasthttp使用實(shí)例小結(jié)
fasthttp?是一個(gè)使用?Go?語(yǔ)言開(kāi)發(fā)的?HTTP?包,主打高性能,針對(duì)?HTTP?請(qǐng)求響應(yīng)流程中的?hot?path?代碼進(jìn)行了優(yōu)化,下面我們就來(lái)介紹go語(yǔ)言fasthttp使用實(shí)例小結(jié),感興趣的朋友跟隨小編一起看看吧2024-03-03

