如何构建GitHub APIv4的Golang查询以获取指定Release
使用githubv4库拉取指定Release返回空值的问题
我在使用githubv4库拉取GitHub仓库的指定Release时遇到了问题:下面的代码始终返回空值,但目标仓库jacobtomlinson/gha-find-replace确实存在v3版本。
有问题的代码:
var releaseQ struct { Repository struct { Release struct { Author githubv4.String } `graphql:"release(tagName:$tagName)"` } `graphql:"repository(owner:$repositoryOwner,name:$repositoryName)"` } variables = map[string]interface{}{ "repositoryOwner": githubv4.String("jacobtomlinson"), "repositoryName": githubv4.String("gha-find-replace"), "tagName": githubv4.String("v3"), } err = client.Query(context.Background(), &releaseQ, variables) if err != nil { fmt.Println("Query returned nothing") } fmt.Println("author:", releaseQ.Repository.Release.Author)
我已经成功实现了以下功能:
- 获取仓库描述(代码可正常返回结果):
var repoDescriptionQ struct { Repository struct { Description string } `graphql:"repository(owner: \"jacobtomlinson\", name: \"gha-find-replace\")"` }
- 获取Issue的反应内容(代码可正常获取结果):
variables := map[string]interface{}{ "repositoryOwner": githubv4.String("jacobtomlinson"), "repositoryName": githubv4.String("gha-find-replace"), "issueNumber": githubv4.Int(55), "reactionContent": githubv4.ReactionContentThumbsDown, } var reactionQ struct { Repository struct { Issue struct { ID githubv4.ID Reactions struct { ViewerHasReacted githubv4.Boolean } `graphql:"reactions(content:$reactionContent)"` } `graphql:"issue(number:$issueNumber)"` } `graphql:"repository(owner:$repositoryOwner,name:$repositoryName)"` }
解决方法
问题出在Release结构体的Author字段定义上:GitHub GraphQL API里,Release的author是一个User对象,而非单纯的字符串类型。你直接将Author映射为githubv4.String,导致字段无法正确解析,最终返回空值。
修改代码中的Release结构体,正确映射author的子字段即可:
var releaseQ struct { Repository struct { Release struct { Author struct { Login githubv4.String // 取User对象的login字段 } `graphql:"author"` } `graphql:"release(tagName:$tagName)"` } `graphql:"repository(owner:$repositoryOwner,name:$repositoryName)"` }
输出时需要访问嵌套的Login字段:
fmt.Println("author:", releaseQ.Repository.Release.Author.Login)
另外,建议优化错误提示,方便定位问题:
if err != nil { fmt.Printf("查询失败:%v\n", err) }
内容的提问来源于stack exchange,提问作者John Set
相关产品推荐
相关产品推荐

