簡體   English   中英

在外部函數中訪問Go結構的值

[英]Access values of Go struct in external function

我有以下函數聲明,該函數可以正常工作並正確打印。

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的值,而不是僅僅打印出來,以便我可以從另一個函數訪問該值,但是我不了解在這種情況下返回的工作方式(Go的新手)。

我以為我可以將結構作為字符串返回,但是在運行它時會出錯。

release.Name undefined (type string has no field or method Name)

這使我認為我沒有正確地解決這個問題。 有人可以指出我正確的方向嗎?

一個問題在這里:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM