Like Share Discussion Bookmark Smile

J.J. Huang   2025-03-12   Getting Started Golang 05.結構   瀏覽次數:次   DMCA.com Protection Status

Go | 不同方式創建結構指標

💬 簡介

在 Go 語言中,創建結構型別的指標有兩種常見方式:使用 &new。這兩種方法看似相似,但其背後有不同的行為和適用場景。本文將深入探討這兩種方法,幫助你更好地理解它們的差異以及在不同情境下該如何選擇。

圖片來源:Gophers


🔎 使用 & 創建結構指標

& 是一種簡單且直觀的方式,用來取得一個已經初始化的結構實例的指標。當你創建結構並希望同時初始化其欄位時,通常會選擇這種方式。

範例:使用 & 創建結構指標

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import "fmt"

type Person struct {
Name string
Age int
}

func main() {
// 使用 & 創建結構指標,並同時初始化欄位
p := &Person{"Alice", 30}
fmt.Println(p) // &{Alice 30}
}

📝 在這個範例中,我們使用 &Person{"Alice", 30} 創建了一個 Person 結構的指標,並初始化了 NameAge 欄位的值。這是一種快速且直接的方式。


🛠 使用 new 創建結構指標

Go 語言中的 new 函式用來分配記憶體並返回該類型的指標。使用 new 創建結構指標時,結構的欄位會被初始化為該類型的零值。

  • 範例:使用 new 創建結構指標
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package main

    import "fmt"

    type Person struct {
    Name string
    Age int
    }

    func main() {
    // 使用 new 創建結構指標,並初始化為零值
    p := new(Person)
    p.Name = "Bob"
    p.Age = 25
    fmt.Println(p) // &{Bob 25}
    }

    📝 在這個範例中,new(Person) 創建了一個 Person 類型的結構並返回指標。此時,NameAge 欄位的初始值分別為空字串 ""0,然後我們再手動為這些欄位賦值。


⚖️ &new 的區別

雖然 &new 都可以用來創建結構指標,但它們的工作原理略有不同:

  • & 的行為:
    • 當使用 & 時,會直接創建一個已初始化的結構實例並返回其指標。
    • 這是一種簡單且直觀的方法,適用於當你知道結構的初始化值時。
  • new 的行為:
    • 使用 new 時,Go 會創建一個空的結構實例(即欄位會被設為該類型的零值),並返回指標。
    • 這樣可以在後續程式碼中修改欄位的值。

簡單的比較:

方法 行為 預設欄位值 何時使用
& 創建並初始化結構,返回指標 你提供的值 當你需要同時初始化欄位時
new 創建空結構,返回指標,欄位為零值 零值("", 0 當結構欄位需要後續賦值時

🚀 何時選擇 &new

  • 使用 &

    • 當你需要創建結構並初始化它的欄位時,& 是最簡單和最直觀的方式。這通常發生在你知道結構欄位的初始值並希望直接初始化它們時。
  • 使用 new

    • 當你需要創建結構並將其欄位初始化為零值,然後在後續程式碼中修改欄位時,new 是不錯的選擇。這對於某些特殊情況或需要封裝成為函式的程式碼很有用。

🎯 總結

  • &new 都可以用來創建結構指標,但它們有不同的用途和行為。
  • & 用來創建已初始化的結構並返回其指標,適合用於你知道結構欄位值的情況。
  • new 則創建零值結構並返回其指標,適合在後續賦值的情況下使用。

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go