2013-09-06 2 views
3

는 최근 이동에 다음 코드를 작성했습니다이동에서 변수에 의해 숨겨진 네임 스페이스에 액세스하는 방법?

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"등)로 인해 모든 종류의 잠재 변수 이름을 예약하는 것으로 보입니다. 어떠한 제안?

답변

6

변수 또는 패키지를 참조하는 데 사용 된 이름의 이름을 바꿀 수 있으므로 "예약 됨"이 아닙니다. 가져올 때

는 단순히 패키지에 다른 별명을 제공 :

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

... 

taskapi, _ := tsk.New(client) 
2

그것은 네임 스페이스와는 아무 상관이있다. 그것은 범위 지정의 일반적인 특성이다 :

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

그리고 솔루션은 일반적인 경우와 동일합니다 : 당신이 그들 (외부 사람)에 액세스하려면 외부 범위에 정의 된 개체와 같은 이름 엔티티를 정의하지 마십시오 . 위의 발췌문에서 내부 'a'는 예를 들어 이름이 지정됩니다. 'a2'또는 'b'또는 'a'를 제외한 모든 것.

물론 디스트로이의 대답도 유효합니다. 바깥 쪽 'a'의 이름을 다른 것으로 바꾸는 것과 같습니다.

저는 문제가 일반적인 문제의 특정 사례이며 일반적인 해결책이 적용된다는 것을 지적하려고합니다.