gpt4 book ai didi

pointers - 我应该在 struct 字段上还是在 struct 上创建指针?走

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:17 26 4
gpt4 key购买 nike

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

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

最佳答案

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

看起来你说的结构是defined here, in the go-github library .它使每个字段都成为一个指针,这样就可以轻松地为任何字段子集传递 nil(只是不要指定它们)。这样,当您构建一个 PATCH 调用以通过 GitHub API 更新某些内容时,您可以指定 Description 是否与您的请求无关(您不更新描述)或者您是否打算将 Description 设置为 ""。关键是 ""nil 在对其 API 的 PATCH 调用中具有不同的含义

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

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

关于pointers - 我应该在 struct 字段上还是在 struct 上创建指针?走,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26849592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com