사용자 정의 패키지를 사용하는 방법


178

Go에서 사용자 정의 패키지를 만들고 사용하려고합니다. 아마도 매우 분명한 것이지만 이것에 대한 많은 정보를 찾을 수 없습니다. 기본적 으로이 두 파일은 동일한 폴더에 있습니다.

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

시도 go run main.go하면이 오류가 발생합니다.

main.go:4:2: import "mylib": cannot find package

go build mylib.go먼저 실행하려고했지만 아무것도하지 않는 것 같습니다 (파일 생성 없음, 오류 메시지 없음). 내가 어떻게 이것을 할 수 있을지 아십니까?


GOPATH 변수를 설정하지 않고 GOROOT 만 설정했습니다.
laurent

1
먼저 go install디렉토리 아래에서 실행 한 후 mylib다시 시도하십시오.
Joe

1
이 스레드 도 참조하십시오 .
kostix

@Joe, 내부에서 "go install"을 실행해도 작동하지 않습니다
hunter_tech

답변:


175

먼저 "Go 코드 작성 방법" 문서 를 읽고 이해하십시오 .

실제 답변은 "사용자 정의 패키지"의 특성에 따라 다릅니다.

일반적인 용도로 사용하려면 소위 "Github 코드 레이아웃"을 사용하십시오 . 기본적으로 라이브러리를 별도의 go get테이블 프로젝트로 만듭니다.

라이브러리가 내부 용인 경우 다음과 같이 갈 수 있습니다.

  1. 라이브러리 파일이있는 디렉토리를 프로젝트의 디렉토리 아래에 두십시오.
  2. 나머지 프로젝트에서 프로젝트가 포함 된 작업 공간의 루트에 상대적인 경로를 사용하여 라이브러리를 참조하십시오.

시연하려면 :

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

이제 최상위 레벨 main.go에서 할 수 import "myproject/mylib"있으며 정상적으로 작동합니다.


1
src /에서 새 프로젝트 (myproject2)를 만들면 어떻게 mylib를 가져올 수 있습니까?
Kiril

2
@Kiril, 당신은 어떻게 mylib코드에서 수입 myproject2합니까? 그런 다음 답은 "사용 import "myproject/mylib"함으로써-Go는 GOPATH환경 변수 에서 추출한 각 디렉토리 아래에서 가져온 경로를 검색한다는 것입니다 ("작업 공간 "이라고 함). 그러나이 검색은 운 좋게 재귀 적이 지 않으므로 이러한 경로는 다음과 같습니다. 각각의 작업 공간에서 효과적으로 "고정"
kostix

4
"패키지 이름"이라는 또 하나의 필수 항목 입니다.
kostix

1
@MatthiasSommer는 일반적으로 mylib를 각 마이크로 서비스가 사용하는 공통 패키지로 추출합니다. "사용"이 정확히 정의 된 방식은 선호하는 워크 플로우에 따라 다릅니다. 엔터프라이즈 급 개발에서는 일반적으로 공급 업체 가 사용되지만 최근 go mod개발에서는 모듈 이 해답이 될 수 있습니다 ( go mod모듈 공급 업체도 지원).
kostix

1
@LeiYang, "가져올 패키지"는 하나 이상의 Go 소스 파일이있는 디렉토리입니다. ".lib 파일로 패키지를 빌드 한 다음 lib 파일을 가져 오는 방법"에 대한 답변은 실제로 요청하려는 내용에 따라 다릅니다. 컴파일 속도에 관심이있는 경우 Go 툴체인 캐시 이진 전용 컴파일 된 패키지 를 컴파일 하고 배포 할 수 있는지 묻고 싶다면 대답은 ' 아니오' 입니다.
kostix

68

이런 종류의 폴더 구조의 경우 :

main.go
mylib/
  mylib.go

가장 간단한 방법은 이것을 사용하는 것입니다.

import (
    "./mylib"
)

1
패키지를 찾을 수 없으므로 최근 버전의 go에서는 더 이상 작동하지 않습니다. 올바른 가져 오기는 foo/mylibmain.go를 포함하는 폴더가이라고 가정합니다 foo.
nemo

6
@nemo, 최신 버전의 go에서는 항상 "./mylib"를 사용하며 작동합니다.
laurent

3
1.2를 사용하면 @ this.lau_에 동의합니다.
canadadry

8
이것이 go install깨짐을 명심하십시오 . 사람들이 다운로드하여 실행하기를 원하는 독립 실행 형 프로젝트를 구축하는 경우 go build에는 괜찮습니다. 그러나 전체 go install지원 을 원할 경우 위에서 언급 한 "깃 허브 코드 레이아웃"(비트 버킷 외부 또는 이와 유사한 경우)을 사용합니다. .
photoionized

나는 이런 식으로 사용하지 마십시오. Godef를 깨뜨릴 것입니다. godef "."에 대해 이해하지 못합니다. 수입
King Jk

6

GitHub에서 호스팅되는 프로젝트의 경우 사람들이 일반적으로 수행하는 작업은 다음과 같습니다.

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

main.go

import "github.com/laike9m/myproject/mylib"

...

6

나는 경험 많은 프로그래머이지만 Go world에 대한 새로운 경험이 있습니다! Go를 이해하는 데 어려움이 거의 없다고 고백합니다. 하위 폴더에 go 파일을 구성하려고 할 때도 같은 문제에 직면했습니다. 내가 한 방식 :

GO_Directory ($ GOPATH에 지정된 것)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

File MyProject \ Entities \ Fiboo \ Client.go에서

package Fiboo

type Client struct{
    ID int
    name string
}

MyProject \ main.go 파일에

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(우분투 16.04에서 Go 1.9를 실행 중입니다)

그리고 너희들을 기억해, 나는 이동에 초보자입니다. 내가하고있는 일이 나쁜 습관이라면 알려주세요!


3

다른 해결책 : $ GOPATH에
추가하십시오 src/myproject.

그런 다음 import "mylib"컴파일합니다.


이것은 github 호스팅 패키지와 같은 get gettable 경로에는 작동하지 않습니다.
Gustav
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.