何时在方法中使用指针并返回指向结构的指针?

时间:2017-01-08 10:45:25

标签: go

我想学习Go。我了解到结构和数组是按值复制的(将它们传递给函数或将它们分配给变量时)。所以我们使用指针来修改它们并节省内存。

问题是,在某些情况下,我总是发现它们使用指向结构的指针。

例如,在an official web application tutorial中,他们使用了代码

 func (p *Page) save() error {
  filename := p.Title + ".txt"
  return ioutil.WriteFile(filename, p.Body, 0600)
 }

这里结构没有发生数据更改。这可能发生在官方包裹和第三方的其他地方。

另一种情况是他们返回& struct {}。上面相同链接的一个例子:

 func loadPage(title string) *Page {
   filename := title + ".txt"
   body, _ := ioutil.ReadFile(filename)
   return &Page{Title: title, Body: body}
 }

那么,应该使用指针的情况和位置?

1 个答案:

答案 0 :(得分:0)

这是一个很酷的关于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
}

关于struct的同样的事情。我使用指针,以便我可以传递和修改变量

中的值

示例:

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
}

总之,每当我想分享价值时,我都会在每种情况下使用指针。