[import] ‘.’는 무엇입니까 Go import 문에서 (점 또는 마침표)는 무엇입니까?

Go 튜토리얼과 내가 본 대부분의 Go 코드에서 패키지는 다음과 같이 가져옵니다.

import (
    "fmt"
    "os"
    "launchpad.net/lpad"
    ...
)

그러나 http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go 에서 gocheck 패키지는 .(마침표)로 가져옵니다 .

import (
    "http"
    . "launchpad.net/gocheck"
    "launchpad.net/lpad"
    "os"    
)

.(기간) 의 중요성은 무엇입니까 ?



답변

임포트 된 패키지의 식별자를 규정 자없이 로컬 파일 블록에서 참조 할 수 있습니다.

이름 대신 명시적인 마침표 (.)가 나타나면 모든 패키지의 내 보낸 식별자가 현재 파일의 파일 블록에 선언되고 한정자없이 액세스 할 수 있습니다.

Sin 함수를 내보내는 package 절 package math가 포함 된 패키지를 컴파일하고 컴파일 된 패키지를 “lib / math”로 식별되는 파일에 설치했다고 가정합니다. 이 표는 다양한 유형의 가져 오기 선언 후 패키지를 가져 오는 파일에서 Sin에 액세스하는 방법을 보여줍니다.

Import declaration          Local name of Sin

import   "lib/math"         math.Sin
import M "lib/math"         M.Sin
import . "lib/math"         Sin

참조 : http://golang.org/doc/go_spec.html#Import_declarations


답변

다음은 파이썬에서 온 사람들에 대한 비유입니다.

  • Go import "os"는 Python과 거의 같습니다.import os
  • Go import . "os"는 Python과 거의 같습니다.from os import *

두 언어 모두 후자를 사용하는 것은 일반적으로 눈살을 찌푸리고 있지만 그럴만한 이유가있을 수 있습니다.


답변

테스트시에만 사용해야합니다.

golang의 위키에있는 문서가 있습니다.

mockgen과 같은 일부 모의 코드를 생성하고 패키지 코드 가져오고 테스트 패키지 패키지 코드를 가져 오는 경우 순환 종속성을 얻습니다 (Something golang은 사용자가 해결 방법을 결정할 수 있도록 선택합니다).

그러나 테스트 패키지 내부에서 테스트중인 패키지에 점 표기법을 사용하는 경우 동일한 패키지로 취급되며 순환 종속성이 없습니다!


답변