Pointers 我应该在struct字段还是struct上创建指针?去

Pointers 我应该在struct字段还是struct上创建指针?去,pointers,struct,go,Pointers,Struct,Go,我想知道指针的最佳实践是什么。我应该在结构或其字段上定义它们吗。我认为定义一个指向结构本身的指针是有意义的,但这里有一个我觉得有趣的例子。如果所有字段都是指针,为什么不使用指向整个结构的指针来获取每个字段的地址 type Tag struct { Tag *string `json:"tag,omitempty"` SHA *string `json:"sha,omitempty"` URL *string `j

我想知道指针的最佳实践是什么。我应该在结构或其字段上定义它们吗。我认为定义一个指向结构本身的指针是有意义的,但这里有一个我觉得有趣的例子。如果所有字段都是指针,为什么不使用指向整个结构的指针来获取每个字段的地址

type Tag struct {
    Tag     *string       `json:"tag,omitempty"`
    SHA     *string       `json:"sha,omitempty"`
    URL     *string       `json:"url,omitempty"`
    Message *string       `json:"message,omitempty"`
    Tagger  *CommitAuthor `json:"tagger,omitempty"`
    Object  *GitObject    `json:"object,omitempty"`
}
下面是结构内容的示例

{
  "tag": "v0.0.1",
  "sha": "940bd336248efae0f9ee5bc7b2d5c985887b16ac",
  "url": "https://api.github.com/repos/octocat/Hello-World/git/tags/940bd336248efae0f9ee5bc7b2d5c985887b16ac",
  "message": "initial version\n",
  "tagger": {
    "name": "Scott Chacon",
    "email": "schacon@gmail.com",
    "date": "2011-06-17T14:53:35-07:00"
  },
  "object": {
    "type": "commit",
    "sha": "c3d0be41ecbe669545ee3e94d31ed9a4bc91ee3c",
    "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/c3d0be41ecbe669545ee3e94d31ed9a4bc91ee3c"
  }
}
使用非指针字段更有效,但在本例中,它们使用指针的原因很奇怪,在中进行了讨论

看起来你所说的结构是。它使每个字段都成为一个指针,因此对任何字段子集传递
nil
都很简单(只是不要指定它们)。这样,当您通过GitHub API构建一个
补丁
调用来更新某些内容时,您可以指定
描述
是否与您的请求无关(您没有更新描述),或者是否打算将
描述
设置为
。关键是
nil
PATCH
调用它们的API时有不同的含义

如果您也希望将零字符串/struct/etc与“不适用于此对象”区分开来,那么也可以使用指针。但是,如果您不需要,最好不要将每个字段都设置为指针,因为这会使内存使用模式变得更糟—占用的RAM稍多,缓存未命中率更高,GC需要跟踪的内容也更多,等等。这种方法不会添加指针间接层(但在编写代码时看起来有点冗长)is,它只是一个带有bool和字符串的结构

在GitHub的例子中,它对性能的任何影响都不是什么大不了的——GitHub响应Web请求所花费的时间将使他们的库所做的任何CPU受限的工作相形见绌。

使用非指针字段更有效,但在这种情况下,他们使用指针的原因很奇怪,在上讨论过

看起来你所说的结构是。它使每个字段都成为一个指针,因此对于任何字段子集传递
nil
都很简单(只是不要指定它们)。这样,当您通过GitHub API构建一个
补丁
调用来更新某些内容时,您可以指定
说明
是否与您的请求无关(您没有更新说明),或者是否打算将
说明
设置为
。关键是
nil
PATCH
对其API的调用中有不同的含义

如果您也希望将零字符串/struct/etc与“不适用于此对象”区分开来,您也可以使用指针。但是,如果您不需要指针,最好不要将每个字段都设置为指针,因为这会使内存使用模式变得更糟—占用的内存稍多,缓存未命中率更高,GC需要跟踪的内容也更多,等等。这种方法不会添加指针间接寻址层(但在编写代码时看起来有点冗长)is,它只是一个带有bool和字符串的结构

在GitHub的例子中,它对性能的任何影响都不是什么大不了的——GitHub响应Web请求所花费的时间将使他们的库所做的任何CPU受限的工作相形见绌。

使用非指针字段更有效,但在这种情况下,他们使用指针的原因很奇怪,在上讨论过

看起来你所说的结构是。它使每个字段都成为一个指针,因此对于任何字段子集传递
nil
都很简单(只是不要指定它们)。这样,当您通过GitHub API构建一个
补丁
调用来更新某些内容时,您可以指定
说明
是否与您的请求无关(您没有更新说明),或者是否打算将
说明
设置为
。关键是
nil
PATCH
对其API的调用中有不同的含义

如果您也希望将零字符串/struct/etc与“不适用于此对象”区分开来,您也可以使用指针。但是,如果您不需要指针,最好不要将每个字段都设置为指针,因为这会使内存使用模式变得更糟—占用的内存稍多,缓存未命中率更高,GC需要跟踪的内容也更多,等等。这种方法不会添加指针间接寻址层(但在编写代码时看起来有点冗长)is,它只是一个带有bool和字符串的结构

在GitHub的例子中,它对性能的任何影响都不是什么大不了的——GitHub响应Web请求所花费的时间将使他们的库所做的任何CPU受限的工作相形见绌。

使用非指针字段更有效,但在这种情况下,他们使用指针的原因很奇怪,在上讨论过

看起来你所说的结构是。它使每个字段都成为一个指针,因此对于任何字段子集传递
nil
都很简单(只是不要指定它们)。这样,当您通过GitHub API构建一个
补丁
调用来更新某些内容时,您可以指定
说明
是否与您的请求无关(您没有更新说明),或者是否打算将
说明
设置为
。关键是
nil
PATCH
对其API的调用中有不同的含义

如果您也希望将零字符串/struct/etc与“不适用于此对象”区分开来,您也可以使用指针。但是,如果您不需要指针,最好不要将每个字段都设置为指针,因为这会使内存使用模式变得更糟—占用的RAM越多,缓存未命中越多,GC需要处理的内容就越多