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


135

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

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


22
검색하기 쉽도록 질문에 점과 마침표를 추가했습니다.
Jared Farrish 2016 년

답변:


182

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

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

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


29
Go 팀은 도트 가져 오기 사용을 권장하지 않습니다. 경우에 따라 이상한 동작이 발생할 수 있으며 언어가 무기한 없을 수도 있습니다.
jimt

일부 시나리오에서는 혼란 스럽지만 go-linq를 사용하여 견딜 수 없었습니다. github.com/ahmetalpbalkan/go-linq
steviesama

아직 내 보내지 않은 기능 (대문자 이외의 기능)에 액세스 할 수 없습니다. 이 수입 방법은 정말 짜증납니다.
David 天宇 Wong

1
도트 임포트를 사용하지 않고 도트 임포트를 사용하여 프로그램을 컴파일 할 때. 컴파일 된 파일 크기가 큰 이유가 있습니까? 도트 가져 오기를 사용하면 더 큰 크기로 컴파일됩니다.
majidarif

@ majidarif : 흥미로운 관찰입니다 :) 문제를 재현하는 코드로 별도의 질문을 게시 할 수 있습니까? (나는 import "fmt"vs 로 간단한 hello-world 프로그램을 컴파일하면서 직접 시도 import . "fmt"했지만 두 경우 모두 같은 크기였습니다.)
Attilio

66

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

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

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


4

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.