我应该在struct字段或struct上创建指针吗?走

时间:2014-11-10 17:37:49

标签: pointers struct go

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

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

1 个答案:

答案 0 :(得分:2)

更有效地拥有非指针字段,但在这种情况下,他们有一个奇怪的理由使用指针,在the blog post "Go, REST APIs, and Pointers"讨论。

您所谈论的结构看起来像是defined here, in the go-github library。它使每个字段成为指针,因此对于任何字段子集传递nil都是微不足道的(只是不指定它们)。这样,当您构建PATCH调用以通过GitHub API更新内容时,您可以指定Description是否与您的请求无关(您没有更新说明)或者您是否打算将Description设置为""。关键是""nil PATCH调用其API时具有不同的含义

如果你有类似的愿望来区分零字符串/结构/等。从“不适用于此对象”,您还可以使用指针。但是,如果你不需要它,最好不要让每个字段成为一个指针,因为这会使你的内存使用模式变得更糟 - 更多的RAM占用,更多的缓存未命中,更多的东西需要跟踪一种不添加指针间接层的方法(但在编写代码时看起来更加冗长)是sql.NullString,它只是一个带有bool和字符串的结构。

在GitHub的情况下,它对性能的影响并不是很大--GitHub响应Web请求所花费的时间会使他们的库所做的任何CPU限制工作相形见绌。