다른 파일에 golang "undefined"함수가 선언되어 있습니까?


135

다른 파일에서 함수를 호출하는 기본 go 프로그램을 작성하려고하지만 동일한 패키지의 일부입니다. 그러나 다음을 반환합니다.

undefined: NewEmployee

소스 코드는 다음과 같습니다.

main.go:

package main

func main() {
emp := NewEmployee()    
}

employee.go:

package main

type Employee struct {
    name string
    age int
}   

func NewEmployee() *Employee {
    p := &Employee{}
    return p
}

func PrintEmployee (p *Employee)  {
    return "Hello world!"
}

파일에 패키지 명세서가 있습니까? 당신이없는 입력 package x, 또한 기본 패키지는 일반적으로 단지 다음 필요로하는 다른 조각을 가져, 하나의 파일을 포함
크리스 Pfohl

8
당신은 사용하고 go run있습니까? (및 golang.org/doc/code.html 참조 )
JimB

1
@JuanM, 내 질문은이다되었다 전체 의 소스 main.goemployee.go? 모든 go 파일에는 package 문이 있어야하기 때문에 귀하의 내용이 없습니다. 참조 : golang.org/doc/code.html#PackageNames
Chris Pfohl

1
employee.go의 마지막 기능이 잘못되었습니다 (함수 이름, 반환 유형이 선언되지 않음). 요청한 문제는 아니지만 더 많은 문제가 있음을 나타냅니다. 컴파일 할 때 완전한 코드와 완전한 오류를 게시 할 수 있습니까?
siritinga

1
그럼 당신의 행동을 보여주세요! GOPATH, 실제 코드 및 go도구 호출 방법
JimB

답변:


173

"Go 코드 작성 방법"을 읽으십시오 .

사용하지 마십시오 /src당신에 GOPATH. 패키지는에 있습니다 $GOPATH/src.

위해 build또는 install당신은 패키지 디렉토리에 파일이 필요합니다.

의 경우 go run모든 파일을 인수로 제공해야합니다.

go run main.go employee.go

그러나 거의 항상을 사용해야합니다 go install(또는 비 주 패키지로 작업 할 때 혼란 go buildgo build유발하기 때문에 전자를 사용하는 것이 좋습니다 )


@JimB 입력에 감사드립니다! 환경 변수를 편집하고 (GOBIN을 설정하는 것을 잊어 버렸습니다) 파일을 올바른 위치로 옮겼지만 여전히 intstall을 시도하면 동일한 오류가 발생합니다. 어떤 제안?
Juan M

다른 오류가 없다고 확신하십니까? employee.go 파일은 그대로 컴파일 할 수 없습니다. 그렇지 않으면, 당신이 무엇을하고 있는지 정확히 알아야합니다. 정확한 경로, 호출 등
JimB

8
또는 $ go run * .go
Puran

실행 $ go run *.go은 모든 파일을 실행하는 대신 지름길입니다
offerni

61

GoLand (Go의 Intellij IDEA)에서 동일한 문제가 발생하여 해결책을 찾았습니다. 당신은을 변경할 필요가 Run kind에서 FilePackage또는 Directory. Run/Edit구성으로 이동하면 드롭 다운에서이를 선택할 수 있습니다 .

예를 들면 : 패키지 ~/go/src/a_package, 용도 Package patha_package과을 Directory~/go/src/a_packageRun kindPackage또는 Directory.


1
고마워요, 이것이 제가 찾던 것입니다. 귀하의 답변은 Intellij IDEA에 관한 것입니다.
키바 간트

13

를 사용하는 경우을 go run수행하십시오 go run *.go. 현재 작업 디렉토리에서 모든 go 파일을 자동으로 찾아 컴파일하고 주 기능을 실행합니다.


이런 식으로 수행하는 데 실패가 있습니까? 이것은 OP 질문에 대한 가장 간단한 답변처럼 보입니다.
Stavros_S


8

다음 중 하나를 시도 할 수 있습니다.

방법 01 : 프로젝트 이름이MyProject

  • 경로로 이동하여 입력 go build하고 Enter 키를 누르십시오.
  • 프로젝트 이름 ( "MyProject")으로 실행 파일을 생성합니다.
  • 그런 다음 터미널 유형에서 ./MyProjectEnter 키를 누릅니다

을 입력하여 두 단계를 동시에 수행 할 수 있습니다 go build && ./MyProject. 모든 go파일로 프로젝트를 올바르게 실행합니다 .

방법 02

그냥 입력 go run *.go하고 Enter 키를 누르십시오. 이것은 모든 을 실행 합니다 go files.

이것이 누군가에게 도움이되기를 바랍니다.


4

다른 go 파일에서 함수를 호출하고 Goland를 사용하는 경우 실행 메뉴에서 '구성 편집'옵션을 찾아 실행 유형을 파일에서 디렉토리로 변경하십시오. 모든 오류를 지우고 다른 go 파일에서 함수를 호출 할 수 있습니다.


1

나는 같은 문제에 부딪 쳤고 Go11다른 사람들 이 같은 문제에 부딪 칠 경우를 돕기 위해 어떻게 해결했는지 공유하고 싶었습니다.

나는 Go 프로젝트를 외부 $GOPATH 에 가지고 있었 으므로이 GO111MODULE=on옵션을 켜지 않고 켜야했습니다.이 문제가 발생합니다. 당신이 전체를 구축하거나 테스트하려고 package하거나 directory그것이 없으면 해결되지 않을지라도GO111MODULE=on


1

go 코드 작성 방법을 따르지 않는 경우 go 모듈 을 사용해야 합니다.

go 모듈을 사용하면 $ GOPATH / src에 코드를 넣을 필요가 없습니다. 다른 곳에서도 살 수 있습니다.

코드를 / employee와 같은 다른 디렉토리로 옮길 수 있습니다. 직원 디렉토리 아래에서 go 모듈을 초기화하십시오.

go mod init example.com/employee

0

소스 폴더가 / go / src / blog로 구조화 된 경우 (소스 폴더의 이름이 블로그 인 경우)

  1. cd / go / src / blog ... (패키지가있는 폴더 안에있는 CD)
  2. 설치하러 가다
  3. 블로그

명령 줄에서 파일을 수동으로 나열하거나 메소드를 "파싱"하는 대신 모든 파일을 동시에 실행해야합니다.


0

go run .모든 파일을 실행합니다. 진입 점은 패키지에 main()고유해야하는 기능 입니다 main.

또 다른 옵션은 바이너리를 빌드 go build하고 실행하는 것입니다.


0

명령 go run *.go을 사용 하여 패키지의 모든 go 파일을 실행하십시오!


답변은 @Paul Razvan Berg의 답변과 같습니다
Chris Catignani 4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.