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

Go語言創(chuàng)建結(jié)構(gòu)體實例對象的幾種常用方式

 更新時間:2025年11月05日 09:56:48   作者:比特森林探險記  
在Go語言中,創(chuàng)建結(jié)構(gòu)體實例的幾種方式有本質(zhì)區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在 Go 語言中,創(chuàng)建結(jié)構(gòu)體實例的幾種方式有本質(zhì)區(qū)別。以下是核心差異的詳細(xì)對比:

1. 內(nèi)存分配與類型差異

?創(chuàng)建方式??內(nèi)存位置??變量類型??是否可被GC回收?
p := Person{...}通常??臻g值類型?(棧自動釋放)
p := new(Person)堆空間指針類型?
p := &Person{...}堆空間指針類型?
var p Person通常??臻g值類型?(棧自動釋放)
工廠函數(shù)返回指針堆空間指針類型?

?? 注:Go 編譯器通過逃逸分析決定實際內(nèi)存位置,大對象通常分配在堆上

2. 初始化方式對比

?創(chuàng)建方式??初始化控制??默認(rèn)值處理??典型代碼示例?
p := Person{...}? 顯式指定字段值未指定字段=零值Person{Name: "Alice"}
p := new(Person)? 必須先創(chuàng)建后賦值所有字段=零值p := new(Person); p.Name="Bob"
p := &Person{...}? 顯式指定字段值未指定字段=零值&Person{Name: "Charlie"}
var p Person? 零值初始化所有字段=零值var p Person
工廠函數(shù)? 完全控制可自定義缺省值NewPerson("David", 35)

3. 修改行為與內(nèi)存開銷

值類型實例 (Person{}或var p Person)

func modify(p Person) {
    p.Name = "Modified" // 修改副本
}
 
func main() {
    p := Person{Name: "Original"}
    modify(p)
    fmt.Println(p.Name) // 輸出 "Original" (未修改)
}
  • ? 優(yōu)點:無GC壓力,內(nèi)存連續(xù)
  • ? 缺點:傳遞時產(chǎn)生完整拷貝?(大結(jié)構(gòu)體性能差)

指針類型實例 (new()或&Person{})

func modify(p *Person) {
    p.Name = "Modified" // 修改原對象
}
 
func main() {
    p := &Person{Name: "Original"}
    modify(p)
    fmt.Println(p.Name) // 輸出 "Modified"
}
  • ? 優(yōu)點:傳遞高效(僅拷貝指針)
  • ? 缺點:增加GC壓力,多一次指針解引用

4. 實際內(nèi)存布局示意圖

值類型實例

棧內(nèi)存
┌───────────────────┐
│ Person實例        │
│ Name: "Alice"     │
│ Age: 30           │
└───────────────────┘

指針類型實例

棧內(nèi)存         堆內(nèi)存
┌───────┐      ┌───────────────────┐
│ 指針  │─────>│ Person實例        │
└───────┘      │ Name: "Bob"       │
               │ Age: 25           │
               └───────────────────┘

5. 各場景使用建議

?場景??推薦方式??原因?
小型結(jié)構(gòu)體 (<64字節(jié))Person{...}避免堆分配開銷
大型結(jié)構(gòu)體或需要跨函數(shù)修改&Person{...}減少拷貝成本
需要自定義初始化邏輯工廠函數(shù)封裝復(fù)雜邏輯/參數(shù)校驗
數(shù)據(jù)庫映射對象&Struct{...}ORM通常需要可修改的指針對象
高頻創(chuàng)建的臨時小對象var p Struct棧分配快速
接口實現(xiàn)對象工廠函數(shù)返回接口return &implStruct{}, implements SomeInterface

性能測試對比

type BigStruct [1024]int64  // 8KB大對象
 
// 測試值傳遞
func BenchmarkValue(b *testing.B) {
    var s BigStruct
    for i := 0; i < b.N; i++ {
        processValue(s)
    }
}
 
// 測試指針傳遞
func BenchmarkPointer(b *testing.B) {
    s := new(BigStruct)
    for i := 0; i < b.N; i++ {
        processPointer(s)
    }
}

?結(jié)果:

  • ?值傳遞?:每次調(diào)用拷貝 8KB 數(shù)據(jù)
  • ?指針傳遞?:每次調(diào)用僅拷貝 8 字節(jié)指針
  • 大對象場景指針效率高 1000 倍+

終極選擇指南

?默認(rèn)首選?:obj := &SomeStruct{...}

  • 適應(yīng)大多數(shù)場景
  • 清晰表達(dá)對象可變性
  • 高效傳遞

?特殊場景選擇?:

// 不可變配置對象
config := AppConfig{Port: 8080}
 
// 零值有特殊含義
var zeroTime time.Time
 
// 微優(yōu)化關(guān)鍵路徑
var localVar SmallStruct

?大型項目?:?工廠函數(shù)統(tǒng)一創(chuàng)建?

// user.go
func NewUser(name string, age int) *User {
    return &User{
        Name: name,
        Age: age,
        regTime: time.Now(),
    }
}

遵循這些原則可在安全性和性能間取得最佳平衡??

到此這篇關(guān)于Go語言創(chuàng)建結(jié)構(gòu)體實例對象的幾種常用方式的文章就介紹到這了,更多相關(guān)Go語言創(chuàng)建結(jié)構(gòu)體實例對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言操作Excel利器之excelize類庫詳解

    Go語言操作Excel利器之excelize類庫詳解

    Excelize是Go語言編寫的用于操作Office Excel文檔基礎(chǔ)庫,基于ECMA-376,ISO/IEC 29500國際標(biāo)準(zhǔn),可以使用它來讀取、寫入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關(guān)于Go語言操作Excel利器之excelize類庫的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Go語言導(dǎo)出內(nèi)容到Excel的方法

    Go語言導(dǎo)出內(nèi)容到Excel的方法

    這篇文章主要介紹了Go語言導(dǎo)出內(nèi)容到Excel的方法,涉及Go語言操作excel的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • golang頻率限制 rate詳解

    golang頻率限制 rate詳解

    這篇文章主要介紹了golang頻率限制 rate詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • gin 獲取post請求的json body操作

    gin 獲取post請求的json body操作

    這篇文章主要介紹了gin 獲取post請求的json body操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 在go中使用omitempty的代碼實例

    在go中使用omitempty的代碼實例

    今天小編就為大家分享一篇關(guān)于在go中使用omitempty的代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Go語言題解LeetCode705設(shè)計哈希集合

    Go語言題解LeetCode705設(shè)計哈希集合

    這篇文章主要為大家介紹了Go語言題解LeetCode705設(shè)計哈希集合,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 一文詳細(xì)介紹golang中.()類型斷言的使用方法

    一文詳細(xì)介紹golang中.()類型斷言的使用方法

    Golang是一門非常流行的編程語言,在很多領(lǐng)域都有著廣泛的應(yīng)用,在開發(fā)過程中,很多時候我們需要將函數(shù)作為參數(shù)傳遞給其他函數(shù),這時候就需要用到golang中的.()用法,本文將詳細(xì)介紹golang中.()的使用方法,需要的朋友可以參考下
    2023-08-08
  • Go語言 go程釋放操作(退出/銷毀)

    Go語言 go程釋放操作(退出/銷毀)

    這篇文章主要介紹了Go語言 go程釋放操作(退出/銷毀),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言使用WaitGroup等待多個協(xié)程完成

    Go語言使用WaitGroup等待多個協(xié)程完成

    sync.WaitGroup是Go標(biāo)準(zhǔn)庫中的一個結(jié)構(gòu)體,用于等待一組goroutine執(zhí)行完成,本文就來介紹一下Go語言使用WaitGroup等待多個協(xié)程完成,感興趣的可以了解一下
    2026-02-02
  • go開源項目用戶名密碼驗證的邏輯鬼才寫法

    go開源項目用戶名密碼驗證的邏輯鬼才寫法

    這篇文章主要為大家介紹了go開源項目中發(fā)現(xiàn)的一個邏輯鬼才寫法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評論

南郑县| 五原县| 徐闻县| 漾濞| 乳源| 通城县| 曲周县| 墨江| 洛宁县| 延津县| 昌乐县| 临城县| 四会市| 祁连县| 新源县| 西丰县| 临泉县| 平阳县| 台江县| 莎车县| 灵丘县| 长治县| 江川县| 淳化县| 当雄县| 北海市| 黄石市| 石首市| 肥东县| 瑞昌市| 曲阳县| 曲麻莱县| 兴隆县| 淮滨县| 齐河县| 丽水市| 石台县| 满洲里市| 闵行区| 沙坪坝区| 独山县|