3

最近、Go で次のコードを書きました。

import (
    tasks "code.google.com/p/google-api-go-client/tasks/v1"
)

func tasksMain(client *http.Client, argv []string) {
    taskapi, _ := tasks.New(client)
    tasklists, _ := taskapi.Tasklists.List().Do()

    for _, tasklist := range tasklists.Items {
        tasks, _ := taskapi.Tasks.List(tasklist.Id).Do()
        for _, task := range tasks.Items {
            log.Println(task.Id, task.Title)
        }
    }
}

しかし、名前空間「タスク」が変数「タスク」によって隠されていることに気付きました。

だから、変数によって隠されている名前空間にアクセスする方法はありますか? そうでない場合、この状況を処理するための他の一般的な手法はありますか。Go が使用するすべての奇妙に短い名前空間 ("url"、"bytes"、"strings" など) により、あらゆる種類の潜在的な変数名が予約されているようです。なにか提案を?

4

2 に答える 2

6

変数またはパッケージを参照するために使用される名前の両方を変更できるため、「予約済み」のものはありません。

インポート時にパッケージに別のエイリアスを与えるだけです:

import (
    tsk "code.google.com/p/google-api-go-client/tasks/v1"
)

...

taskapi, _ := tsk.New(client)
于 2013-09-06T06:48:17.373 に答える
2

名前空間とは関係ありません。これは、スコープの一般的なプロパティです。

func foo() {
        var a int
        {
            a := 42
            // Cannot access the outer 'a' here.
        }
}

解決策は一般的な場合と同じです。それらにアクセスしたい場合は、外側のスコープで定義されたエンティティと同じ名前のエンティティを定義しないでください(外側のもの)。上記のスニペットでは、内側の 'a' に名前が付けられます。「a2」または「b」、または「a」以外のもの。

もちろん、dystroyの答えも有効です。これは、外側の「a」を別の名前に変更することと同じです。

あなたの問題は一般的な問題の特定のインスタンスであり、一般的な解決策がそれに適用されることを指摘しようとしています.

于 2013-09-06T07:50:25.867 に答える