Lỗi “không thể tải gói: gói my_prog: đã tìm thấy gói my_prog và chính”


75

Trong GOPATH của tôi, tôi có một cái gì đó như thế này:

/bin/
/pkg/
/src/
/src/my_prog/
/src/my_prog/main.go
/src/my_prog/d_interface.go
/src/my_prog/d_struct_that_implements_the_interface.go

Trong main.gotôi có package main, trong d_interface.god_struct_that_implements_the_interface.gotôi có package my_prog.

Khi tôi cố gắng, go build my_progtôi gặp lỗi sau:

can't load package: package my_prog: found packages my_prog (d_interface.go) and main (main.go) in C:\dev\Code\Go\src\my_prog

Điều này có nghĩa là bất kỳ tệp nào thuộc về package mainsẽ đi vào thư mục riêng của nó? Nếu vậy, lý do cho điều này là gì?

Câu trả lời:


77

Có, mỗi gói phải được xác định trong thư mục riêng của nó.

Cấu trúc nguồn được định nghĩa trong Cách viết mã Go .

Gói là một thành phần mà bạn có thể sử dụng trong nhiều chương trình, mà bạn có thể xuất bản, nhập, lấy từ một URL, v.v. Vì vậy, nó hợp lý khi có thư mục riêng giống như một chương trình có thể có một thư mục.


Có, nhưng gói chính có đủ điều kiện là một gói độc lập không? Theo hiểu biết của tôi, package main là một ngôn ngữ khác cung cấp điểm nhập (giống như các lớp của Java có public static main).
TheTeaMan

Vâng, đó là cách nó hoạt động. Trong thực tế, tôi đặt trong gói "chính" của mình rất ít mã, chỉ có một mã không thể sử dụng trong các chương trình khác.
Denys Séguret

8
Nói thẳng ra là khá khó chịu. Tôi không thấy lý do gì để tách điểm vào chính khỏi phần còn lại của chương trình. Tôi sẽ chấp nhận câu trả lời này.
TheTeaMan

Khi tôi tạo một chương trình, tôi thường có nhiều tiện ích nhỏ sử dụng cùng một dữ liệu / mô hình / vv .. Thật tiện lợi khi chia nhỏ mọi thứ trong các gói và có tất cả các chương trình rất nhỏ và sử dụng các gói đó. BTW, bạn có thể đợi một chút trước khi chấp nhận câu trả lời, để những người dùng khác có động lực cung cấp cho bạn những câu trả lời khác (có thể tốt hơn).
Denys Séguret

2
Tôi vẫn chưa cài đặt bất cứ thứ gì, chỉ đang xây dựng chương trình. Chương trình phụ thuộc vào cả hai gói. Tôi phát hiện ra rằng việc đưa gói chính /src/my_prog/và gói my_prog vào /src/my_prog/my_prog/hoạt động.
TheTeaMan

17

Ngoài ra, nếu tất cả những gì bạn đang cố gắng làm là chia nhỏ tệp main.go thành nhiều tệp, sau đó chỉ cần đặt tên cho các tệp khác là "gói chính" miễn là bạn chỉ xác định chức năng chính trong một trong các tệp đó, bạn có thể đi.


2

Đảm bảo rằng gói của bạn được cài đặt trong $GOPATH thư mục hoặc đã có bên trong không gian làm việc / gói của bạn.

Ví dụ: nếu của bạn $GOPATH = "c:\go", hãy đảm bảo rằng gói bên trongC:\Go\src\pkgName

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.