How to access a namespace hidden by a variable in Go?

671 views Asked by At

I've recently wrote the following code in 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)
        }
    }
}

But then I realized that now the namespace "tasks" is hidden by the variable "tasks".

So I'm wondering, is there any way to still access the namespace once it's hidden by a variable? If not, is there any other common technique to handle this situation. With all the strangely short namespaces that Go uses ("url", "bytes", "strings", etc.), it seems it's reserving itself all kind of potential variable names. Any suggestion?

2

There are 2 answers

0
Denys Séguret On BEST ANSWER

There's nothing "reserved" as you can both rename your variables or the name used to refer to the package.

Simply give another alias to the package when importing :

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

...

taskapi, _ := tsk.New(client)
0
zzzz On

It has nothing to do with namespaces. It's a general property of scoping:

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

And the solution is the same as in the general case: Do not define entities named the same as entities defined in outer scopes if you want to access them (the outer ones). In the above snippet, the inner 'a' would be named eg. 'a2' or 'b' or whatever except 'a'.

dystroy's answer is valid as well, of course. It equals to renaming the outer 'a' to something else.

I'm just trying to point out that your problem is a specific instance of a general issue and the general solution applies to it.