ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10장 패키지와 Go 도구
    프로그래밍/Golang 2019. 11. 20. 23:45
    The Go Programming language

    10.1 소개

    모든 패키지 시스템의 목적은 관련된 기능들을 쉽게 이해하고 변경할 수 있으며 프로그램 내의 다른 패키지와 독립된 하나의 단위로 묶어서 대형 프로그램의 설계와 관리를 쉽게 하는 것이다.

     

    10.2 임포트 경로

    각 패키지는 임포트 경로라는 고유한 문자열로 식별된다. 임포트 경로는 import 선언에 표시되는 문자열이다.

     

    10.3 패키지 선언

    모든 Go 소스 파일은 package 선언을 시작한다. 이 선언의 주 목적은 다른 패키지에 의해 임포트될 때의 기본 식별자(패키지 이름이라 함)를 결정하는 것이다.

    예를 들어 math/rand 패키지의 모든 파일은 package rand로 시작하므로 이 패키지를 임포트하면 해당 멤버에 rand.Int, rand.Float64 등으로 접근할 수 있다.

    패키지명은 관행적으로 임포트 경로의 "마지막 부분"이며, 이로 인해 임포트 경로가 다른 별개의 두 패키지가 같은 이름을 가질 수 있다. 예를 들어 임포트 경로가 math/rand와 crypto/rand인 두 패키지는 모두 같은 이름 rand를 갖는다. 대체 이름(alternative name)을 지정해 회피한다.

     

    "마지막 부분"이라는 관행에는 세 가지 예외가 있다.

    첫 번째로 명령(Go 실행 프로그램)을 정의하는 패키지는 패키지의 임포트 경로와 무관하게 패키지명으로 항상 main을 사용한다. 이는 go build에게 실행 파일을 만들기 위해 링커를 호출해야 한다고 알리는 신호다.

    두 번째로 디렉토리 안의 파일명이 _test.go로 끝나는 일부 파일들은 패키지명 뒤에 _test가 붙을 수 있다. 이런 디렉토리는 두 가지 패키지인 일반 패키지 및 외부 테스트 패키지를 정의할 수 있다. _test 접미사는 go test에 두 패키지를 모두 빌드해야 한다고 알리며, 파일들이 각각 어떤 패키지에 속하는지를 나타낸다. 외부 테스트 패키지는 테스트 의존성으로 인한 임포트 그래프의 순환을 방지하기 위해 사용된다.

    세 번째로 의존성을 관리하는 일부 도구에서 패키지 임포트 경로에 "gopkg.in/yaml.v2"와 같이 버전을 접미사로 추가하는 것이다. 패키지 이름은 접미사를 제외하므로 이 경우에는 그냥 yaml이 될 것이다.

    10.4 import 선언

    Go 소스 파일은 package 선언 직후 최초의 임포트가 아닌 선언이 나오기 전에 0개 이상의 import 선언을 포함할 수 있다. 각 import 선언은 단일 패키지의 임포트 경로를 지정하거나 여러 패키지의 임포트 경로를 괄호로 묶어서 나열할 수 있다.

     

    임포트된 패키지는 빈 줄로 구분할 수 있다. 이 묶음은 일반적으로 다른 도메인을 나타낸다.

     

    math/rand와 crypto/rand처럼 이름이 같은 두 패키지를 세 번째 패키지에 임포트할 때는 충돌을 피하기 위해 import 선언 중 적어도 하나에 대체 이름을 지정해야 한다. 이것을 리네임 임포트(rename import)라 한다.

    import ( 
    	"crypto/rand"
    	mrand "math/rand" // alternative name mrand avoids conflict 
    )

    대체 이름은 임포트하는 파일에서만 유효하다.

    10.5 공백 임포트

    패키지를 파일로 임포트하고 정의된 패키지명을 파일 안에서 참조하지 않으면 오류가 ㅂ라생한다. 오류를 방지하기 위해 빈 식별자인 _로 대체 이름을 지정해야 한다.  이를 공백 임포트(blank import)라 한다. 다른 경우와 마찬가지로 빈 식별자는 참조할 수 없다.

    import _ "image/png" // register PNG decoder

    10.6 패키지 이름 짓기

    패키지를 만들 때는 가능하면 짧은 이름이 좋지만, 의미를 알 수 없을 정도로 짧아서는 안된다. 

    가능한 한 서술적이고 모호하지 않게 하라. 예를 들어 유틸리티 패키지의 이름으로는 util 대신 imageutil이나 ioutil처럼 구체적이고 간결한 이름을 사용하라. 지역 변수에 자주 사용되는 이름을 패키지명으로 사용하지 않아야 한다.

    패키지 이름은 일반적으로 단수 형태를 취한다.

    10.7 Go 도구

    10.7.1 작업 공간 구조

    GOPATH 환경 변수는 작업 공간의 루트를 지정한다.

    GOROOT 환경 변수는 표준 라이브러리의 모든 패키지를 제공하는 Go 배포본의 루트 디렉토리를 지정한다.

    10.7.2 패키지 다운로드

    go 도구를 사용할 때 패키지의 임포트 경로는 로컬 작업 공간 외에 인터넷상의 위치도 나타내기 때문에 go get을 사용해 가져오고 갱신할 수 있다.

    go get 명령에 -u 플래그를 지정하면 빌드 및 설치하기 전에 의존성을 포함한 모든 패키지가 최신 버전으로 업데이트되게 한다.이미 배포된 프로젝트와 같이 릴리스 시 정교한 의존성 제어가 필수적인 경우에는 적합하지 않을 수 있으며 벤더링(vendoring)으로 해결한다.

    10.7.3 패키지 빌드

    go build 명령은 인수로 주어진 각 패키지를 컴파일한다.

    go install 명령은 go build와 매우 유사하지만 각 패키지의 컴파일된 코드와 명령을 폐기하지 않는다 컴파일된 패키지는 소스가 있는 src 디렉토리와 일치하는 $GOPATH/pkg 디렉토리 아래에 저장되며 실행 파일은 $GOPATH/bin 디렉토리에 저장된다.

    go build 명령의 -i 플래그는 빌드 타겟의 의존성 패키지들을 설치한다.

    go install은 환경 변수 GOOS와 GOARCH의 값이 포함된 이름의 하위 디렉토리 아래에 컴파일된 패키지를 저장한다.

    10.7.4패키지 문서화

    익스포트된 패키지 멤버와 패키지 선언 자체에는 그 목적과 사용법을 설명하는 주석이 선행돼야 한다.

    Go의 문서 주석은 항상 완전한 문자이며, 첫 번째 문장은 보통 선언된 이름으로 시작하는 요약문이다. 함수 파라미터와 기타 식별자는 인용표시나 마크업 없이 언급된다.

    // Fprintf formats according to a format specifier and writes to w.
    // It returns the number of bytes written and any write error encountered. 
    func Fprintf(w io.Writer, format string, a ...interface{}) (int, error)

    go doc 도구는 커맨드라인에 지정된 요소의 선언과 문서 주석을 출력하며 요소에는 패키지가 올 수 있다.

    -analysis=type과 -analys=pointer 플래그는 문서와 소스코드에 고수준 정적 분석 결과를 추가한다.

    10.7.5 내부 패키지

    새 패키지의 API를 조급하게 커밋하지 않고 일부 사용자에게 "시험 중"으로 배포해 실험할 수 있다.

    go build 도구는 이러한 필요에 의해 피키지의 임포트 경로에 internal이라는 부분이 있으면 특별히 취급한다. 이러한 패키지를 내부 패키지라 한다.

    내부 패키지는 internal 디렉토리의 상위 디레고리 안에 있는 다른 패키지에서만 임포트할 수 있다.

    10.7.6 패키지 조회

    go list 도구는 사용 가능한 패키지에 대한 정보를 보고한다.

    go list 명령은 일회성 대화형 쿼리와 빌드 및 테스트 자동화 스크립트에 모두 유용하다.

Designed by Tistory.