我正在努力学习围棋。我了解到结构和数组是按值复制的(将它们传递给函数或将它们分配给变量时)。所以我们使用指针来允许修改它们并节省内存。
问题是,在某些情况下,我总是发现它们使用指向结构的指针。
例如,在 an official web application tutorial 中他们使用了代码
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
这里结构没有发生数据变化。这发生在官方包和第 3 方包的其他地方。
另一种情况是当它们返回 &struct{} 时。来自上面同一链接的示例:
func loadPage(title string) *Page {
filename := title + ".txt"
body, _ := ioutil.ReadFile(filename)
return &Page{Title: title, Body: body}
}
那么,在什么情况下和什么地方应该使用指针呢?
这是一个关于 go 的很酷的想法,我们可以使用指针来节省内存使用量。
在我的案例中,每当我从数据库中获取数据并想从中更改某些内容时,我都会使用指针。因此我使用指针来节省内存使用量。
例子:
func GetUserShopInfo(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
//....
shop_data, err := shop.GetUserShopInfo(user_id)
// manipulate shop_data
shop.ChangeValue(&shop_data)
// you will get the result here without creating new variable
}
然后,每当我想共享值时,我都会使用指针,并更改它们而无需创建新变量来获取结果。
例子:
func main(){
a := 10
ChangeValue(&a)
// a will change here
}
func ChangeValue(a *int){
// do something to a
}
关于结构也是一样的。我使用了指针,这样我就可以传递和修改变量中的值
例子:
type Student struct {
Human
Schoool string
Loan float32
}
// use pointer so that we can modify the Loan value from previous
func (s *Student) BorrowMoney(amount float32) {
s.Loan += amount
}
总而言之,每当我想共享值时,我都会在所有情况下使用指针。