Like Share Discussion Bookmark Smile

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

Go | 如何使用結構中變數?

💬 簡介

在 Go 語言中,結構型別(struct)是一種非常常用的資料類型,它可以用來封裝多個不同類型的變數。這些變數(稱為欄位)可以是各種基本資料類型、陣列、切片、或甚至是其他結構型別。在這篇文章中,我們將深入探討如何在 Go 中定義結構,並且如何操作結構中的變數。

圖片來源:Gophers


🔍 創建結構

結構型別是將多個資料欄位結合在一起的容器。你可以定義自己的結構型別,並將不同類型的資料儲存在其中。

  • 範例:創建簡單的結構
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package main

    import "fmt"

    // 定義一個結構型別 'Person'
    type Person struct {
    Name string
    Age int
    }

    func main() {
    // 創建結構實例並賦值
    p := Person{"Alice", 30}
    fmt.Println(p) // 輸出: {Alice 30}
    }

    📝 在這個範例中,我們創建了一個名為 Person 的結構,它包含了兩個欄位:Name(字符串類型)和 Age(整數類型)。在 main 函式中,我們創建了這個結構的實例並給它賦值。


🛠 結構中的變數操作

一旦你有了結構的實例,你就可以直接訪問結構中的變數(欄位)。你可以使用點號 (.) 來訪問和修改結構中的欄位。

📌 不使用指標創建結構

  • 範例:訪問和修改結構變數
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package main

    import "fmt"

    type Person struct {
    Name string
    Age int
    }

    func main() {
    // 創建結構實例
    p := Person{"Bob", 25}

    // 訪問結構中的欄位
    fmt.Println("Name:", p.Name) // 輸出: Name: Bob
    fmt.Println("Age:", p.Age) // 輸出: Age: 25

    // 修改結構中的欄位
    p.Name = "Charlie"
    p.Age = 28
    fmt.Println("Updated Person:", p) // 輸出: Updated Person: {Charlie 28}
    }

    📝 在這個範例中,我們創建了一個 Person 結構的實例,並通過點號操作符訪問和修改了 NameAge 欄位。

📌 結構中的變數是指標類型

在 Go 中,你也可以將結構中的變數定義為指標類型。當結構的欄位是指標時,這些欄位會指向某個記憶體位置,並且我們可以透過指標來間接修改其值。以下是如何操作結構中的指標變數。

  • 範例:結構欄位為指標類型
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package main

    import "fmt"

    // 定義結構,其中欄位是指標類型
    type Person struct {
    Name *string
    Age *int
    }

    func main() {
    name := "Bob"
    age := 25

    // 創建結構實例,並初始化指標欄位
    p := Person{
    Name: &name,
    Age: &age,
    }

    // 訪問指標欄位
    fmt.Println("Name:", *p.Name) // 輸出: Name: Bob
    fmt.Println("Age:", *p.Age) // 輸出: Age: 25

    // 修改指標欄位指向的值
    newName := "Alice"
    newAge := 30
    p.Name = &newName
    p.Age = &newAge

    fmt.Println("Updated Name:", *p.Name) // 輸出: Updated Name: Alice
    fmt.Println("Updated Age:", *p.Age) // 輸出: Updated Age: 30
    }

    📝 在這個範例中,我們創建了一個結構 Person,其欄位 NameAge 都是指標類型。當我們創建結構實例時,我們使用 & 來取得變數的記憶體位址,並將其賦給結構欄位。之後,我們可以透過解引用 * 操作符來訪問和修改這些指標指向的值。

📌 結構與變數是指標類型

如果結構中的欄位是指標類型,並且我們希望能夠在其他地方修改這些欄位的值,則需要使用結構的指標來操作。

  • 範例:使用結構指標修改指標欄位
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package main

    import "fmt"

    type Person struct {
    Name *string
    Age *int
    }

    // 定義函式來修改結構中的指標欄位
    func updateAge(p *Person, newAge int) {
    *p.Age = newAge // 修改指標欄位指向的值
    }

    func main() {
    name := "Eve"
    age := 22

    p := &Person{
    Name: &name,
    Age: &age,
    }

    // 修改指標欄位
    fmt.Println("Before Update:", *p.Name, *p.Age) // 輸出: Before Update: Eve 22
    updateAge(p, 26)
    fmt.Println("After Update:", *p.Name, *p.Age) // 輸出: After Update: Eve 26
    }

    📝 在這個範例中,我們使用 updateAge 函式來修改 Person 結構的 Age 欄位。由於結構是指標類型,我們可以在函式內部直接修改結構的欄位,並且這些變更會影響到原始結構。


⚠️ 注意事項

  • 指標的初始化 當結構中的欄位是指標時,記得要初始化指標變數,避免 nil pointer dereference 的錯誤。如果不初始化,指標默認為 nil,對其解引用會導致錯誤。
  • 避免空指標錯誤 (nil pointer dereference) 使用指標時,必須小心處理指標是否為 nil。如果解引用 nil 指標,會引發運行時錯誤。
    • 範例:
      1
      2
      var p *Person
      fmt.Println(*p.Name) // 會引發錯誤,因為 p 為 nil
  • 適當使用結構指標當結構中的欄位是指標類型時,應確保指標指向有效的記憶體區域,並且在操作前檢查指標是否為 nil

🎯 總結

  • Go 中的結構型別是用來將多個資料欄位結合在一起的容器。
  • 使用點號 (.) 來訪問和修改結構中的變數。
  • 使用結構指標可以讓你在函式中修改原始結構中的變數。
  • 當結構較大或需要共享狀態時,使用結構指標來避免複製資料並提高效能。

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


註:以上參考了
Go