在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/