Hàm golang không xác định được hàm khai báo trong tệp khác?


135

Tôi đang cố gắng viết một chương trình go cơ bản gọi một hàm trên một tệp khác, nhưng là một phần của cùng một gói. Tuy nhiên, nó trả về:

undefined: NewEmployee

Đây là mã nguồn:

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!"
}

tập tin của bạn có báo cáo gói không? Những gì bạn đã nhập không có package x, gói chính của bạn thường chỉ chứa một tệp duy nhất, sau đó nhập các phần khác mà nó cần
Chris Pfohl

8
bạn đang sử dụng go runà (và xem golang.org/doc/code.html )
JimB

1
@JuanM, câu hỏi của tôi là nguồn hoàn chỉnh của main.goemployee.go? Bởi vì tất cả các tệp đi được cho là có một tuyên bố gói và tôi không thấy bất kỳ tệp nào trong tệp của bạn. Xem: golang.org/doc/code.html#PackageNames
Chris Pfohl

1
Chức năng cuối cùng của worker.go là sai (không có tên hàm, không có kiểu trả về được khai báo). Nó không phải là vấn đề bạn yêu cầu, nhưng nó cho thấy có nhiều vấn đề hơn. Bạn có thể gửi mã hoàn chỉnh và lỗi hoàn chỉnh khi biên dịch không?
siritinga

1
sau đó cho chúng tôi thấy những gì bạn đang làm! GOPATH, mã thực tế và cách bạn gọi gocông cụ.
JimB

Câu trả lời:


172

Vui lòng đọc "Cách viết mã Go" .

Đừng sử dụng /srctrong của bạn GOPATH. Gói được đặt tại $GOPATH/src.

Cho buildhoặc installbạn cần phải có các tập tin của bạn trong một thư mục gói.

Đối với go run, bạn cần cung cấp tất cả các tệp làm đối số:

go run main.go employee.go

Nhưng, hầu như bạn luôn luôn nên sử dụng go install, hoặc go build(tốt nhất là trước đây, vì go buildgây nhầm lẫn khi làm việc với các gói không chính)


cảm ơn vì đầu vào @JimB! Tôi đã chỉnh sửa các biến môi trường (tôi cũng đã quên đặt GOBIN), di chuyển các tệp của mình đến đúng vị trí, nhưng khi tôi thử đi intstall tôi cũng gặp lỗi tương tự. Bất kỳ đề xuất?
Juan M

Bạn có chắc chắn không có lỗi khác? Tập tin worker.go của bạn không thể biên dịch như hiện tại. Nếu không, tôi cần phải xem chính xác những gì bạn đang làm. Đường dẫn chính xác, lời mời, v.v.
JimB

8
Hoặc làm $ go run * .go
Puran

đang chạy $ go run *.gosẽ là một lối tắt thay vì chạy tất cả các tệp
offerni

60

Tôi chỉ gặp vấn đề tương tự ở GoLand (đó là Intellij IDEA cho Go) và đưa ra giải pháp. Bạn cần thay đổi Run kindtừ Filethành Packagehoặc Directory. Bạn có thể chọn mục này từ trình đơn thả xuống nếu bạn đi vào Run/EditCấu hình.

Ví dụ: đối với gói ~/go/src/a_package, sử dụng một Package pathtrong a_packagevà một Directorycủa ~/go/src/a_packageRun kindcủa Packagehoặc Directory.


1
Cảm ơn bạn, đây là những gì tôi đang tìm kiếm. Hãy đề cập rằng câu trả lời của bạn là về Intellij IDEA.
kivagant

12

Nếu bạn đang sử dụng go run, hãy làm go run *.go. Nó sẽ tự động tìm tất cả các tệp đi trong thư mục làm việc hiện tại, biên dịch và sau đó chạy chức năng chính của bạn.


Có bất kỳ nhược điểm để làm theo cách này? Đây dường như là câu trả lời đơn giản nhất cho câu hỏi của OP.
Stavros_S


8

Bạn có thể thử một trong những điều sau đây.

Phương pháp 01 : giả sử rằng tên dự án của bạn làMyProject

  • đi đến con đường của bạn, gõ go buildvà nhấn enter.
  • nó sẽ tạo một tệp thực thi như tên dự án của bạn ("MyProject")
  • sau đó trong loại thiết bị đầu cuối của bạn ./MyProjectvà nhấn enter

bạn có thể làm cả hai bước cùng một lúc bằng cách gõ go build && ./MyProject. nó sẽ chạy dự án của bạn đúng cách với tất cả gocác tập tin.

Phương pháp 02

chỉ cần gõ go run *.govà nhấn enter. Điều này sẽ thực hiện tất cả của bạn go files.

Hy vọng điều này sẽ giúp cho một ai đó.


4

Nếu bạn muốn gọi một chức năng từ một tệp go khác và bạn đang sử dụng Goland, thì hãy tìm tùy chọn 'Chỉnh sửa cấu hình' từ menu Run và thay đổi loại chạy từ Tệp sang Thư mục. Nó xóa tất cả các lỗi và cho phép bạn gọi các chức năng từ các tệp đi khác.


1

Tôi gặp vấn đề tương tự Go11, chỉ muốn chia sẻ cách tôi đã giải quyết nó vì đã giúp đỡ người khác trong trường hợp họ gặp phải vấn đề tương tự.

Tôi đã có dự án Go của mình bên ngoài $GOPATH , vì vậy tôi phải bật GO111MODULE=onmà không bật tùy chọn này, nó sẽ cung cấp cho bạn vấn đề này; ngay cả khi bạn cố gắng xây dựng hoặc kiểm tra toàn bộ packagehoặc directorynó sẽ không được giải quyết mà không cóGO111MODULE=on


1

bạn nên sử dụng mô-đun go ngay bây giờ, nếu bạn không theo dõi Cách viết mã go

Với mô-đun go, bạn không phải đặt mã vào $ GOPATH / src. nó có thể sống ở bất kỳ vị trí nào khác.

Bạn có thể di chuyển mã đến thư mục khác như / staff, Để làm cho nó hoạt động Ngay dưới thư mục nhân viên khởi tạo mô-đun đi

go mod init example.com/employee

0

Nếu thư mục nguồn của bạn có cấu trúc / go / src / blog (giả sử tên của thư mục nguồn của bạn là blog).

  1. cd / go / src / blog ... (cd bên trong thư mục có gói của bạn)
  2. đi cài đặt
  3. Blog

Điều đó sẽ chạy tất cả các tệp của bạn cùng một lúc, thay vì bạn phải liệt kê các tệp theo cách thủ công hoặc "bashing" một phương thức trên dòng lệnh.


0

go run .sẽ chạy tất cả các tập tin của bạn. Điểm vào là chức năng main()phải là duy nhất cho maingói.

Một tùy chọn khác là xây dựng nhị phân với go buildvà chạy nó.


0

Chỉ cần sử dụng lệnh go run *.gođể thực thi tất cả các tệp đi trong gói của bạn!


Câu trả lời giống như câu trả lời @Paul Razvan Berg
Chris Catignani
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.