为什么在这个golang教程中指针用于结构实例?

时间:2017-01-10 01:59:49

标签: pointers go slice

在golang中创建一个简单的api,为什么this教程使用

var movies = map[string]*Movie{
    "tt0076759": &Movie{Title: "Star Wars: A New Hope", Rating: "8.7", Year: "1977"},
    "tt0082971": &Movie{Title: "Indiana Jones: Raiders of the Lost Ark", Rating: "8.6", Year: "1981"},
}

虽然this other tutorial使用了类似的内容:

type Movies []Movie
var movies Movies
movies = append(movies, Movie{id: "tt0076759", Title: "Star Wars: A New Hope", Rating: "8.7", Year: "1977"})

似乎第一个给了我一个包含键值对的映射,其中值是指向电影的指针。第二个给我一个电影的数组(片?),其中id作为查找的关键。为什么在第一个中使用指针?

2 个答案:

答案 0 :(得分:0)

首先,您需要了解指针的用途。当您想要分享时,请使用指针作为Tour of Go

  

指针保存值

的内存地址

作为第一个教程,因为他们想要创建共享值的变量,因此它使用更少的内存。

作为第二个教程,您不需要将指针变量添加到切片。 因为Slice it self是一种引用类型。

  

切片保存对基础数组的引用,如果您指定一个   切片到另一个,都指向同一个数组。

一些参考: https://golang.org/doc/effective_go.html#slices
https://stackoverflow.com/a/2441112/2652524

答案 1 :(得分:0)

我浏览了一篇文章,看不出任何特别的原因。也许他已经实现了那个帖子中未涵盖的内容,就像* Movie的方法接收器一样。

考虑这个例子:https://play.golang.org/p/SZb47MKIr3

它将无法编译,因为“打印”功能有一个指针接收器,但地图中的实例不是指针。

虽然这个例子:https://play.golang.org/p/g0aXXcze5d运行良好。

这是解释差异的好帖子:https://nathanleclaire.com/blog/2014/08/09/dont-get-bitten-by-pointer-vs-non-pointer-method-receivers-in-golang/