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

但后来我意识到现在命名空间“tasks”被变量“tasks”隐藏了。

所以我想知道,一旦命名空间被变量隐藏,有没有办法仍然可以访问它?如果没有,是否有任何其他常用技术来处理这种情况。由于 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 回答