预先存储对指针的引用与在移动中引用指针之间的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了预先存储对指针的引用与在移动中引用指针之间的区别相关的知识,希望对你有一定的参考价值。

首先,希望问题的标题是有意义的(随意建议编辑)。我以前从未处理过手动指针,只是学习Go。

所以,正在做以下事情:

func something() {
  something := *thing
  go func() {
    for err := range something.Errors() {
      fmt.Println(err)
    }
  }()
}

......有任何优势:

func something() {
  go func() {
    for err := range (*thing).Errors() {
      fmt.Println(err)
    }
  }()
}

请注意,我已尝试在第二种情况下执行*thing.Errors(),但它给了我错误,除非我把括号围绕它(这是可以理解的,因为Errors()方法不返回任何指针,我猜?)。


虽然这是我通常不关心的微优化,但出于学习和好奇的目的,第二种情况不会有更多的性能开销(因为它在每次迭代时引用指针)?

你问什么是thing?很可能是一个结构,或者可能是一个接口或可能是任何东西(我知道某些组件,如地图,字符串,函数,结构等,默认情况下通过引用传递。但我仍然想知道那些组件是不)。

答案

如果Errorsthe method set*thing,那么你可以使用for err := range thing.Errors() { ... }

因为range expression is evaluated once at the beginning of the loop,问题中的两个片段和我在这个答案中的建议之间应该没有性能差异。

以上是关于预先存储对指针的引用与在移动中引用指针之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

指针和引用的区别

引用传参与指针传参的区别

按引用传递或按值传递指针容器之间的区别

引用和指针

引用与指针的区别

取消引用指针和访问数组元素之间的区别