最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言中的結構體嵌入詳解(最新推薦)

 更新時間:2025年12月31日 09:11:50   作者:半桶水專家  
結構體嵌入是Go語言中的一種特性,允許在一個結構體中包含另一個結構體,從而實現(xiàn)代碼復用和方法復用,嵌入結構體的字段和方法會被提升到外部結構體中,可以直接訪問,本文給大家介紹go語言中的結構體嵌入的相關知識,感興趣的朋友跟隨小編一起看看吧

一、什么是結構體嵌入?

結構體嵌入 = 在一個結構體中,直接寫另一個結構體類型,不寫字段名

type Base struct {
	ID   int
	Name string
}
type User struct {
	Base   // 嵌入結構體(匿名字段)
	Age int
}

等價于(語義上):

type User struct {
	Base Base
	Age  int
}

但用法和能力完全不同(這是重點)。

二、最直觀的效果:字段“提升”(Promoted Fields)

1?? 直接訪問被嵌入結構體的字段

u := User{
	Base: Base{
		ID:   1,
		Name: "Tom",
	},
	Age: 18,
}
fmt.Println(u.ID)        // 1
fmt.Println(u.Name)      // Tom
fmt.Println(u.Base.ID)   // 1(也可以)

?? Base 的字段被“提升”到了 User 上

三、方法也會被“提升”(非常關鍵)

1?? 嵌入結構體的方法

type Base struct{}
func (b Base) Hello() {
	fmt.Println("hello from Base")
}
type User struct {
	Base
}
var u User 
u.Hello() // 等價于 u.Base.Hello()

?? 字段 + 方法都會被提升

四、結構體嵌入 ≠ 繼承,但很像

Go 沒有 extends,但結構體嵌入提供了:

能力Go 結構體嵌入
代碼復用?
方法復用?
多繼承?(可嵌入多個)
父子類型關系?(不是 is-a)

五、嵌入多個結構體(類似多繼承)

type Logger struct{}
func (l Logger) Log() { fmt.Println("log") }
type Auth struct{}
func (a Auth) Check() { fmt.Println("auth") }
type Service struct {
	Logger
	Auth
}
s := Service{}
s.Log()
s.Check()

?? Go 允許多個嵌入結構體

六、字段 / 方法沖突規(guī)則(必考點)

1?? 同名字段沖突

type A struct {
	Name string
}
type B struct {
	Name string
}
type C struct {
	A
	B
}

? 不能直接:

c.Name // 編譯錯誤:ambiguous selector

? 必須顯式指定:

c.A.Name 
c.B.Name

2?? 子結構體“覆蓋”嵌入結構體字段

type Base struct {
	Name string
}
type User struct {
	Base
	Name string
}
u := User{}
u.Name = "UserName"      // 訪問的是 User.Name
u.Base.Name = "BaseName"

?? 就近原則:優(yōu)先訪問最外層字段

七、值嵌入 vs 指針嵌入(非常重要)

1?? 值嵌入

type User struct {
	Base
}
  • 拷貝一份 Base
  • 修改時改的是副本

2?? 指針嵌入(推薦)

type User struct {
	*Base
}
b := &Base{ID: 1}
u := User{Base: b}
u.ID = 2
fmt.Println(b.ID) // 2

? 共享同一份數(shù)據(jù)
? 常用于組合、組件設計

八、嵌入結構體與接口的“神級配合”

這是 Go 非常核心的設計思想。

1?? 嵌入結構體自動“繼承”接口實現(xiàn)

type Speaker interface {
	Speak()
}
type Human struct{}
func (h Human) Speak() {
	fmt.Println("human speak")
}
type Student struct {
	Human
}
var s Speaker = Student{} // ? Student 自動實現(xiàn) Speaker
s.Speak()

?? 只要嵌入的結構體實現(xiàn)了接口,外層結構體也實現(xiàn)了接口

九、嵌入基礎類型(不常用但要知道)

type MyInt int
type Counter struct {
	MyInt
}
c := Counter{}
c.MyInt = 10

?? 不如結構體嵌入常見,但合法

十、結構體嵌入 vs 普通字段 對比

對比項嵌入結構體普通字段
訪問方式u.IDu.Base.ID
方法提升??
接口繼承??
語義組合擁有

?? 推薦原則
?? 想復用行為(方法) → 用嵌入
?? 只是數(shù)據(jù)成員 → 用普通字段

十一、工程實踐中的典型用法

1?? Web / 業(yè)務模型

type Model struct {
	ID        uint
	CreatedAt time.Time
	UpdatedAt time.Time
}
type Order struct {
	Model
	OrderNo string
}

(GORM 就大量用這個模式)

2?? 裝飾 / 組合模式

type Service struct {
	*Logger
	*DB
}

十二、常見坑總結 ??

  • ? 以為是繼承(不是)
  • ? 字段沖突沒處理
  • ? 不理解指針嵌入 vs 值嵌入
  • ? 濫用嵌入(嵌太多層可讀性差)

到此這篇關于go語言中的結構體嵌入詳解的文章就介紹到這了,更多相關go語言結構體嵌入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang時間、時區(qū)、格式的使用方法

    golang時間、時區(qū)、格式的使用方法

    這篇文章主要介紹了golang時間、時區(qū)、格式的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • Golang中的閉包(Closures)詳解

    Golang中的閉包(Closures)詳解

    在?Golang?中,閉包是一個引用了作用域之外的變量的函數(shù),Golang?中的匿名函數(shù)也被稱為閉包,閉包可以被認為是一種特殊類型的匿名函數(shù),所以本文就給大家詳細的介紹一下Golang的閉包到底是什么,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • sync.WaitGroup的用法及說明

    sync.WaitGroup的用法及說明

    Go語言中WaitGroup用于同步goroutine,Add設置計數(shù)器,Done減1,Wait阻塞直到計數(shù)器歸零,示例顯示并發(fā)執(zhí)行結果順序隨機,但整體完成后輸出over
    2025-07-07
  • Go語言之init函數(shù)

    Go語言之init函數(shù)

    Go語言有一個特殊的函數(shù)init,先于main函數(shù)執(zhí)行,實現(xiàn)包級別的一些初始化操作。這篇文章介紹了Go中的Init函數(shù),對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • go語言import報錯處理圖文詳解

    go語言import報錯處理圖文詳解

    今天本來想嘗試一下go語言中公有和私有的方法,結果import其他包的時候直接報錯了,下面這篇文章主要給大家介紹了關于go語言import報錯處理的相關資料,需要的朋友可以參考下
    2023-04-04
  • Golang時間及時間戳的獲取轉換超全面詳細講解

    Golang時間及時間戳的獲取轉換超全面詳細講解

    說實話,golang的時間轉化還是很麻煩的,最起碼比php麻煩很多,下面這篇文章主要給大家介紹了關于golang時間/時間戳的獲取與轉換的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • 淺析Go使用定時器時如何避免潛在的內存泄漏陷阱

    淺析Go使用定時器時如何避免潛在的內存泄漏陷阱

    這篇文章來和大家一起探討一下Go?中如何高效使用?timer,特別是與select?一起使用時,如何防止?jié)撛诘膬却嫘孤﹩栴},感興趣的可以了解下
    2024-01-01
  • Go語言中Redis緩存與本地內存緩存實戰(zhàn)

    Go語言中Redis緩存與本地內存緩存實戰(zhàn)

    在現(xiàn)代高并發(fā)系統(tǒng)中,緩存技術是提升性能和降低數(shù)據(jù)庫壓力的關鍵手段,本文將為大家介紹一下Redis緩存與本地內存緩存的具體應用,需要的可以了解下
    2025-03-03
  • Golang實現(xiàn)自己的orm框架實例探索

    Golang實現(xiàn)自己的orm框架實例探索

    這篇文章主要為大家介紹了Golang實現(xiàn)自己的orm框架實例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Golang中的int類型和uint類型到底有多大?

    Golang中的int類型和uint類型到底有多大?

    int和uint類型在我們日常開發(fā)中經常會用到,但有個疑問就是這兩個類型有多大,通過各種嘗試最終得到了答案,所以下面這篇文章主要給大家介紹了關于Golang中的int類型和uint類型到底有多大的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12

最新評論

旬阳县| 张家港市| 星座| 巴林右旗| 建阳市| 铜梁县| 绵竹市| 云浮市| 出国| 嘉黎县| 天门市| 秦皇岛市| 洪雅县| 阳高县| 东源县| 思茅市| 禹城市| 巴里| 方正县| 赤城县| 扶绥县| 共和县| 怀安县| 山东省| 宾阳县| 东明县| 鄂托克前旗| 安达市| 阿瓦提县| 若羌县| 仙桃市| 循化| 汤阴县| 密云县| 道孚县| 万全县| 新兴县| 龙游县| 开封市| 瑞丽市| 北辰区|