본문으로 건너뛰기

3장 패키지

go의 경우 각각의 패키지를 개별적으로 가져오기 및 활용이 가능. 덕분에 여타 언어처럼 큰 모듈을 통째로 가져올 필요 없이 필요한 특정 기능만을 가져오는 것이 가능.

모든 .go 파일들은 공백 및 주석을 제외한 첫 줄에 자신의 패키지 이름이 위치해야 함.

동일한 패키지는 동일한 디렉토리에 저장됨. 즉, 하나의 디렉토리에 여러 패키지가 존재할 수 없음.

패키지 이름 규칙​

  • 반드시 디렉토리의 이름과 동일해야 한다.
  • 짧고 간결하면 소문자로만 구성되어야 한다.

main 패키지​

  • 모든 go 프로그램은 main 패키지를 가져야 한다.
  • main 패키지 안에는 반드시 main() 함수가 있어야 한다.
  • main 패키지는 다른 이름의 디렉토리 안에 존재할 수 있으며 이 경우 해당 디렉토리 이름으로 바이너리가 컴파일된다.

command, package​

  • command: Go에서 command는 대부분의 실행 가능한 프로그램을 의미
  • package: Go에서 package는 import가 가능한 의미적 단위

import​

  • import "package name"
  • import (
    "package 1"
    "package 2"
    )
  • 일반 패키지의 경우 GOPATH 를 기준으로 상대 경로 탐색
  • 표준 라이브러리 패키지의 경우 Go 설치 경로를 기준으로 탐색
  • GOPATH 에 나열된 순서대로 하나하나 탐색. 가장 먼저 발견하는 패키지 참조

remote import​

  • 네트워크 저장소에서 패키지를 읽어오는 방법
  • go get 사용

renaming​

  • 여러 패키지의 이름이 동일할 때 사용하는 방법
  • import newName "package"
  • go의 경우 import한 패키지를 한번도 참조하지 않으면 컴파일러 에러 발생.
    • 참조하진 않지만 꼭 import할 필요성이 있다면 (init() 메소드의 호출 필요 등) 빈 식별자로 패키지 이름 지정
    • import _ "unused"

init​

  • 초기화 작업을 위해 사용하는 함수
  • main()이 실행되기 전에 먼저 실행됨
  • DB driver 등 런타임 초기화에서 사용됨
  • init() 메소드는 필요하지만 패키지 자체를 사용할 일은 없다면 빈 식별자로 패키지 이름 지정 필요

Go 내장 도구 사용​

  • go build
    • 패키지 또는 경로 사용 가능.
    • 패러미터가 없으면 현재 경로 기준으로.
    • 경로에 ... 을 넣으면 와일드카드로 동작.
  • go clean
    • 빌드 결과물 삭제
  • go run
    • 빌드하고 바로 실행
  • go vet
    • 코드 정적 검사
  • go fmt
    • 코드 리포맷
    • 가능한한 많이 사용하는걸 추천. 적어도 커밋하기 이전에는 한번 실행하는게 좋음.

문서화 도구​

  1. go doc
    1. CLI 환경에서 사용
    2. 패러미터로 패키지 이름 사용
  2. godoc
    1. 브라우저로 문서 탐색하고 싶을 때 사용
    2. 로컬에 웹서버 띄우는 것도 가능
    3. 외부 패키지는 물론 직접 작성한 패키지에 대해서도 문서 제공

의존성 관리​

  • godep
  • vendor
  • gopkg.in

vendoring, import path rewriting​

  • 모든 dependency를 프로젝트 디렉토리 내부에 복사
  • dependency를 참조하는 import를 복사한 경로로 재작성