수색…
패키지 활성화
패키지에는 main 전에 한 번만 실행되는 init
메소드가있을 수 있습니다.
package usefull
func init() {
// init code
}
아무 것도 참조하지 않고 패키지 초기화를 실행하려면 다음 가져 오기 표현식을 사용하십시오.
import _ "usefull"
패키지 종속성 관리
Go 의존성을 다운로드하는 일반적인 방법은 패키지를 global / shared $GOPATH/src
디렉토리에 저장하는 go get <package>
명령을 사용하는 것입니다. 즉, 각 패키지의 단일 버전이 종속성으로 포함 된 각 프로젝트에 링크됩니다. 이것은 또한 새로운 개발자가 프로젝트를 배포 할 때 각 종속성의 최신 버전을 go get
것임을 의미합니다.
그러나 프로젝트의 모든 종속성을 vendor/
디렉토리에 첨부하여 빌드 환경을 일관되게 유지할 수 있습니다. 프로젝트 리포지토리와 함께 커밋 된 종속성을 유지하면 프로젝트 별 종속성 버전 관리를 수행하고 빌드에 일관된 환경을 제공 할 수 있습니다.
이것은 프로젝트의 구조가 다음과 같이 보입니다.
$GOPATH/src/
├── github.com/username/project/
| ├── main.go
| ├── vendor/
| | ├── github.com/pkg/errors
| | ├── github.com/gorilla/mux
다른 패키지 및 폴더 이름 사용
폴더 이름 이외의 패키지 이름을 사용하는 것은 완벽합니다. 그렇게하면 디렉토리 구조에 따라 패키지를 가져와야하지만, 가져온 후에는 package 절에서 사용한 이름으로 참조해야합니다.
예를 들어, $GOPATH/src/mypck
폴더가 있고 그 안에 a.go
파일이 a.go
.
package apple
const Pi = 3.14
이 패키지 사용 :
package main
import (
"mypck"
"fmt"
)
func main() {
fmt.Println(apple.Pi)
}
이 방법이 효과가 있지만 패키지 이름을 폴더 이름에서 벗어나는 좋은 이유가 있어야합니다 (또는 오해와 혼란의 원인이 될 수 있음).
이것의 용도는 무엇입니까?
단순한. 패키지 이름은 Go idetifier입니다 .
identifier = letter { letter | unicode_digit } .
유니 코드 문자를 식별자에 사용할 수 있습니다. 예를 들어, αβ
는 이동의 유효한 식별자입니다. 폴더 및 파일 이름은 Go가 아닌 운영 체제에서 처리하며 다른 파일 시스템에는 다른 제한 사항이 있습니다. 사실 모든 유효한 Go 식별자를 폴더 이름으로 허용하지 않는 많은 파일 시스템이 있으므로 패키지에 언어 스펙이 허용하는 것의 이름을 지정할 수 없게됩니다.
패키지를 포함하는 폴더와 다른 패키지 이름을 사용하는 옵션을 사용하면 기본 운영 체제 및 파일 시스템에 관계없이 언어 스펙이 허용하는 패키지 이름을 실제로 지정할 수 있습니다.
패키지 가져 오기
다음 명령문을 사용하여 단일 패키지를 가져올 수 있습니다.
import "path/to/package"
여러 개의 가져 오기를 함께 그룹화하거나 그룹화하십시오.
import (
"path/to/package1"
"path/to/package2"
)
이 대응에 모양 import
의 내부 경로 $GOPATH
에 대한 .go
파일 및 통해 수출 이름에 액세스 할 수 있습니다 packagename.AnyExportedName
.
또한 ./
사용하여 패키지를 시작하여 현재 폴더의 로컬 패키지에 액세스 할 수 있습니다. 다음과 같은 구조의 프로젝트에서 :
project
├── src
│ ├── package1
│ │ └── file1.go
│ └── package2
│ └── file2.go
└── main.go
file1.go
및 file2.go
코드를 가져 오기 위해 main.go
에서 이것을 호출 할 수 있습니다.
import (
"./src/package1"
"./src/package2"
)
패키지 이름이 다른 라이브러리에서 충돌 할 수 있으므로 한 패키지를 새 이름으로 별명을 지정할 수 있습니다. import 문에 사용할 이름을 접두어로 사용하여이 작업을 수행 할 수 있습니다.
import (
"fmt" //fmt from the standardlibrary
tfmt "some/thirdparty/fmt" //fmt from some other library
)
이렇게하면 fmt.*
사용하여 이전 fmt
패키지에 액세스하고 tfmt.*
사용하여 후자의 fmt
패키지에 액세스 할 수 있습니다.
또한 패키지를 자신의 네임 스페이스로 가져올 수 있으므로 package.
없이 내 보낸 이름을 참조 할 수 있습니다 package.
별칭으로 단일 점을 사용하는 접두사 :
import (
. "fmt"
)
위의 예에서는 fmt
를 전역 네임 스페이스로 가져오고 예를 들어 Printf
직접 호출 할 수 있습니다. 놀이터
패키지를 가져 왔지만 내 보낸 이름을 사용하지 않으면 Go 컴파일러는 오류 메시지를 인쇄합니다. 이 문제를 피하기 위해 별칭을 밑줄로 설정할 수 있습니다.
import (
_ "fmt"
)
이 패키지에 직접 액세스하지 않고 실행할 수있는 init
함수가 필요한 경우 유용 할 수 있습니다.
노트 :
패키지 이름이 폴더 구조를 기반으로하므로 폴더 이름 및 가져 오기 참조 (대소 문자 포함)의 변경으로 인해 Linux 및 OS-X에서 컴파일 시간 오류 "대소 문자를 구별하지 못함"이 발생하여 추적하기가 어렵습니다 수정 (오류 메시지는 단순한 필사자에게는 다소 반대의 것을 전달하려고 함), 대 / 소문자 구분으로 인해 실패했습니다.
예 : "path / to / Package1"vs "path / to / package1"
실제 예 : https://github.com/akamai-open/AkamaiOPEN-edgegrid-golang/issues/2