在外部函数中访问Go结构的值

时间:2015-07-25 02:32:22

标签: function struct go

我有以下功能声明,可正常工作和打印。

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)

这让我觉得我没有正确接近这个。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

这里有一个问题:

var release string
...
if err != nil {
...
} else {
    release := releases[0]  // <-- here
}

在指示的行中,您定义一个名为release new 变量,该变量等于releases[0],该变量的范围仅限于else子句(使用{{1 }})。然后立即超出范围。我很惊讶你没有得到一个未使用的变量警告。您似乎还需要将:=的类型更改为release。尝试:

github.RepositoryTag

然而,更为惯用的做法是(未经测试):

var release github.RepositoryTag
...
if err != nil {
...
} else {
    release = releases[0]  // note equals sign
}