我有以下函数说明符,它正确地工作并打印出来。
import (
"fmt"
"github.com/google/go-github/github"
)
func LatestTag(user, project string) {
client := github.NewClient(nil)
releases, _, err := client.Repositories.ListTags(user, project, nil)
if err != nil {
fmt.Printf("error: %v\n", err)
} else {
release := releases[0]
fmt.Printf("Version: %+v\n", *release.Name)
}
}编辑
我已经修改了函数,以返回一个字符串(我认为这是不对的),但希望它能够帮助我了解我想要做的事情。
import (
"fmt"
"github.com/google/go-github/github"
)
func LatestTag(user, project string) string {
client := github.NewClient(nil)
releases, _, err := client.Repositories.ListTags(user, project, nil)
var release string
if err != nil {
fmt.Printf("error: %v\n", err)
} else {
release := releases[0]
}
return *release.Name
}我想返回*release.Name的值,而不只是打印出来,这样我就可以从另一个函数访问这个值,但是我不明白在这种情况下返回是如何工作的(非常新)。
我在想,我可以将结构作为字符串返回,但运行时会出现错误。
release.Name undefined (type string has no field or method Name)这让我觉得我没有正确地对待这件事。谁能给我指明正确的方向吗?
发布于 2015-07-25 07:21:08
一个问题是:
var release string
...
if err != nil {
...
} else {
release := releases[0] // <-- here
}在指示的行中,您定义了一个名为release的新变量,它等于releases[0],其作用域仅限于else子句(使用:=)。那就会立即超出范围。我很惊讶你没有收到一个未使用的变量警告。看起来您还需要将release类型更改为github.RepositoryTag。尝试:
var release github.RepositoryTag
...
if err != nil {
...
} else {
release = releases[0] // note equals sign
}然而,一种更惯用的方法是(未经测试的):
func LatestTag(user, project string) (string, error) {
client := github.NewClient(nil)
if releases, _, err := client.Repositories.ListTags(user, project, nil); err != nil {
return "", err
} else {
release := releases[0]
return *release.Name, nil
}
}https://stackoverflow.com/questions/31622282
复制相似问题