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

标签 go

<分区>

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

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

例如,在 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
}

总而言之,每当我想共享值时,我都会在所有情况下使用指针。

关于go - 何时在方法中使用指针并返回指向结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41531838/

相关文章:

go - 在包的 init 函数中初始化变量是否确保 golang 应用程序中的单个实例?

go > 如何从 main 重构 http 处理程序

go - 开始时遇到困难。 `package main` 引发运行时错误 - 索引超出范围?

http覆盖golang中的http头代码而json编码有错误

go - 如何使用 NATS 正确传递远程父跨度?

go - golang插件如何验证包的版本?

go - 是什么导致 'go build' 以 'unexpected NUL in input' 失败?

html - 无法获取文本区域值

去新手: Getting "mismatched types *int and int" error when trying to compare reference to static integer

testing - 测试 '-timeout 0' 未反射(reflect)在执行中