동일한 폴더에 go 파일 가져 오기


84

로컬 go 파일을 다른 go 파일로 가져 오는 데 어려움이 있습니다.

내 프로젝트 구조는 아래와 같습니다.

-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin

b.go 안에 a.go를 가져 오려고합니다. 나는 다음을 시도했다.

import "a"
import "github.com/xxxx/a"

이것들 중 어느 것도 효과가 없었습니다 .. 나는 GOPATH와 간섭해야한다는 것을 이해하지만 제대로 할 수 없었습니다. 현재 내 GOPATH가 samplego (/ workspace / samplego)를 가리키고 있습니다. 아래 오류가 발생합니다.

cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)

또한 이러한 소스 파일을 다른 프로젝트 / 모듈로 가져올 때 GOPATH는 어떻게 작동합니까? 그렇다면 현지 수입이 문제가 될까요? 이 경우 모범 사례는 무엇입니까-모듈에 하나의 go 파일 (관련 테스트 포함) 만있는 것입니까?


디렉토리의 모든 파일은 처음부터 동일한 패키지의 일부입니다. (그리고 package a상단에 동일한 선언 이 있어야합니다 .)
twotwotwo

@twotwotwo 감사합니다 ... 위의 문제를 해결하는 방법을 알려주시겠습니까? 또한 패키지에 여러 개의 go 파일이있을 때 가져 오기가 전체 경로를 따라야합니다. github.com/xxxx/a 또는 그냥 할 것입니다
g0c00l.g33k 2014

Go 모듈의 경우 동일한 디렉토리에있는 파일은 여전히 ​​동일한 패키지의 일부이며 동일한 패키지 이름 (예 :)을 가져야하며 package foo서로 직접 가져올 필요가 없습니다. 이 답변 은 Go 모듈 아래의 동일한 모듈에서 패키지를 가져 오는 방법을 포함하여 Go 모듈에 대해 조금 더 다룹니다.
typical182

답변:


76

디렉토리의 모든 파일은 단일 패키지입니다. 한 파일에서 선언 된 기호는 imports 또는 한정자 없이 다른 파일에서 사용할 수 있습니다 . 모든 파일 package foo의 맨 위에 동일한 선언 이 필요합니다 (또는에서 오류가 발생합니다 go build).

당신은 필요합니까 GOPATH당신의 디렉토리로 세트를 pkg, srcbin디렉토리가 존재합니다. 이것은 단지 선호도의 문제이지만, 앱당 하나가 아닌 모든 앱 (때때로 $HOME)에 대해 하나의 작업 공간을 갖는 것이 일반적 입니다.

일반적으로 Github 경로는 github.com/username/reponame(단지 github.com/xxxx)입니다. 따라서 main다른 패키지 를 갖고 싶다면 다음 workspace/src과 같은 작업을 끝낼 수 있습니다.

github.com/
  username/
    reponame/
      main.go   // package main, importing "github.com/username/reponame/b"
      b/
        b.go    // package b

항상 전체 github.com/...경로를 사용하여 가져옵니다 . 상대 가져 오기는 작업 공간에서 허용되지 않습니다. 경로 입력에 지쳤 으면 goimports. 당신이을 사용하고 있다면 go run, 다음으로 전환해야 할 때입니다 go build: run여러 파일을 제대로 처리하지 main않았고 테스트를 귀찮게하지 않았지만 ( 여기 Dave Cheney 에서 ) go run더러운 종속성을 다시 빌드하지 않는다고 들었습니다 .

적어도 GOPATH를 올바른 것으로 설정하려고 시도한 것처럼 들리므로 여전히 멈춘 경우 환경 변수 (명령 등)를 설정하는 방법과 실행 한 명령 및 발생한 오류를 정확히 포함 할 수 있습니다. 다음은 Linux / UNIX에서이를 설정 (및 설정을 지속적으로 유지)하는 방법에 대한 지침 이며 작업 공간 설정에 대한 Go 팀의 조언입니다 . 둘 다 도움이되지 않을 수도 있지만, 혼란 스러울 경우 어느 부분이 혼란 스러울 지 살펴보고 적어도 어느 부분을 가리켜보십시오.


1
goimports는 매우 도움이되었습니다. :)
g0c00l.g33k

기본 패키지에서 여러 파일을 실행하는 데 문제가있는 경우이 답변을 참조하십시오 .
Rick Smith

package main동일한 디렉토리의 모든 파일에 동일한 선언을 추가 했지만 undefined오류가 발생 하여 동일한 디렉토리에있는 main.go파일에서 함수를 볼 수 없습니다 controllers.go.
ame

2
@AlexChaliy를 사용하는 경우 go run두 파일 이름을 모두 명시 적으로 전달하거나 GOPATH의 패키지에 넣고 go building으로 전환해야 할 수 있습니다. 또한 패키지 구조와 관련이없는 일반적인 오류 (예 : 오타)를 다시 확인하십시오. 어느 것도 해결되지 않으면 가능한 모든 세부 사항을 포함하여 새로운 질문을 열겠습니다. 그것은 정확하게하는 방법에 대한 논의가 많이 걸릴 수 있습니다 하여 해결하는 디렉토리, 파일 등 모양을하고는 특별히 설정에 대한 것 새로운 질문이 그를위한 최고의 장소처럼 보인다입니다.
twotwotwo 2018

40

당신이 두 선언으로 어떤 가져 오기가 긴으로 필요하지 않습니다 a.gob.go같은 패키지에있을 수 있습니다. 그런 다음 다음을 사용 go run하여 여러 파일을 인식하는 데 사용할 수 있습니다 .

$ go run a.go b.go

14

./main.go (메인 패키지)
./a/a.go (패키지 a)
./a/b.go (패키지 a)

이 경우 :
main.go import "./a"

a.go 및 b.go의 함수를 호출 할 수 있습니다.


0

user2889485의 답장과 같이 일부 파일을 기본 폴더에서 옮기기 위해 정말 기본적인 것을 원했지만 그의 특정 대답은 저에게 효과적이지 않았습니다. 나는 그들이 같은 패키지에 있든 아니든 상관하지 않았습니다.

내 GOPATH 작업 공간이 c:\work\go있고 그 아래에 있습니다.

/src/pg/main.go      (package main)
/src/pg/dbtypes.go   (pakage dbtypes)

에서 main.goI import "/pg/dbtypes"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.