先來看一個簡單的範例:
var a int = 10
b := a
b = 20
fmt.Println(a) // 10
fmt.Println(b) // 20
在這個範例中,我們首先宣告並初始化一個變數 a,其值為 10。接著初始化另一個變數 b,並將 a 的值賦給 b。然後將 b 的值更改為 20。最後印出 a 和 b 的值,分別為 10 和 20。
那如果我們將 a 的指標賦給 b,然後將 b 的值更改為 20 ,會得到怎樣的結果?
var a int = 10
b := &a
*b = 20 // 要使用 * 才能改到指摽的值
fmt.Println(a) // 20
fmt.Println(*b) // 20
在這個範例中,我們將 a 的指標賦值給 b,然後使用 *b 的方式來更改 a 的值。因為 b 存儲的是 a 的記憶體地址,所以當我們通過 *b 修改該地址上的值時,a 的值也會被修改。最後印出 a 和 *b 的值,結果均為 20。
type Person struct {
Name string
Age int
}
person := &Person{
Name: "John",
Age: 30,
}
person.Name = "Doe"
person.Age = 40
fmt.Println(person.Name) // Doe
fmt.Println(person.Age) // 40
type Person struct {
Name string
Age int
}
people := make([]*Person, 0)
person := &Person{
Name: "John",
Age: 30,
}
people = append(people, person)
fmt.Println(people[0]) // &{John 30}
type Person struct {
Name string
Age int
}
peopleMap := make(map[string]*Person)
peopleMap["person_a"] = &Person{
Name: "John",
Age: 30,
}
peopleMap["person_b"] = &Person{
Name: "Jane",
Age: 20,
}
fmt.Println(peopleMap) // map[1:0xc00012a000 2:0xc00012a018]
以上為 struct、slice 和 map 與指標搭配時,最常使用的開發情境。
先來看 ChatGPT 的答案
在以下情況下,你應該考慮使用指標:
以我目前的實務經驗,大部分的情況都是使用指標,這要注意的是使用指標可能會影響到原始資料,所以操作時要格外注意。不使用指標其實也是可以的,但缺點就如上述所說可能會造成記憶體浪費。
這沒有一定的答案,以依照開發需求或團隊風格為主。