'.'는 무엇입니까 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.