Pointers 在本golang教程中,为什么指针用于结构实例?

Pointers 在本golang教程中,为什么指针用于结构实例?,pointers,go,slice,Pointers,Go,Slice,在golang中制作一个简单的api,为什么教程使用 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: "19

在golang中制作一个简单的api,为什么教程使用

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"},
}
而while使用的更像:

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

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

首先,您需要了解指针的用途。如果要共享该值,请使用指针作为

指针保存值的内存地址

作为第一个教程,因为他们希望创建共享值的变量,以便使用更少的内存

作为第二个教程,您不需要向切片添加指针变量。 因为它本身就是一个引用类型

切片保存对底层数组的引用,如果指定了一个 切片到另一个,两者都引用相同的数组

一些参考:

我浏览了这篇文章,看不出有什么特别的原因。也许他实现了一些文章中没有提到的东西,比如电影的方法接收器

考虑这个例子:

它将无法编译,因为“Print”函数有一个指针接收器,但映射中的实例不是指针

而这个例子:运行良好


这是一篇解释差异的好文章:

“为什么在第一篇文章中使用指针?”因为作者选择这样做。我看不出任何特别的原因。我在这里看到的只是关于缓存一致性的一点建议。在切片中使用这样的结构会很好,因为在序列中会有所需的数据。空间局部性对于优化缓存使用非常重要,这指的是将相关数据彼此靠近。在第一个示例中,他没有做但可以做的一件事是更新结构字段,这需要一个指针。在没有中间变量的情况下,无法更改映射中存储的对象的结构字段(因为它们不可寻址),但如果结构是通过指针存储在映射中,则可以更改。这个限制不适用于切片。不回答这个问题我想帮助他理解切片中指针的用法。以及为什么我们需要在地图中使用它。也许这只是一种观点。但我希望我的回答能帮助他