Go | 如何使用結構中變數?
💬 簡介
在 Go 語言中,結構型別(struct
)是一種非常常用的資料類型,它可以用來封裝多個不同類型的變數。這些變數(稱為欄位)可以是各種基本資料類型、陣列、切片、或甚至是其他結構型別。在這篇文章中,我們將深入探討如何在 Go 中定義結構,並且如何操作結構中的變數。
圖片來源:Gophers
🔍 創建結構
結構型別是將多個資料欄位結合在一起的容器。你可以定義自己的結構型別,並將不同類型的資料儲存在其中。
- 範例:創建簡單的結構
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package 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
22package 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
結構的實例,並通過點號操作符訪問和修改了Name
和Age
欄位。
📌 結構中的變數是指標類型
在 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
33package 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
,其欄位Name
和Age
都是指標類型。當我們創建結構實例時,我們使用&
來取得變數的記憶體位址,並將其賦給結構欄位。之後,我們可以透過解引用*
操作符來訪問和修改這些指標指向的值。
📌 結構與變數是指標類型
如果結構中的欄位是指標類型,並且我們希望能夠在其他地方修改這些欄位的值,則需要使用結構的指標來操作。
- 範例:使用結構指標修改指標欄位
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
28package 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
2var p *Person
fmt.Println(*p.Name) // 會引發錯誤,因為 p 為 nil
- 範例:
- 適當使用結構指標當結構中的欄位是指標類型時,應確保指標指向有效的記憶體區域,並且在操作前檢查指標是否為
nil
。
🎯 總結
- Go 中的結構型別是用來將多個資料欄位結合在一起的容器。
- 使用點號 (
.
) 來訪問和修改結構中的變數。 - 使用結構指標可以讓你在函式中修改原始結構中的變數。
- 當結構較大或需要共享狀態時,使用結構指標來避免複製資料並提高效能。
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go