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



在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"},
}

而另一个教程使用的东西更像:

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

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

首先,您需要了解指针的用途。当您想要共享值时,请使用指针作为围棋之旅

指针保存值的内存地址

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

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

切片包含对基础数组的引用,如果您分配了一个 切片到另一个,两者都引用同一个数组。

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

我浏览了这篇文章,我看不出任何特别的原因。也许他已经实现了那篇文章中没有涉及的东西,比如 *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/

最新更新