nhập các tệp go trong cùng một thư mục


84

Tôi đang gặp khó khăn trong việc nhập tệp go cục bộ vào một tệp go khác.

Cấu trúc dự án của tôi giống như bên dưới

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

Tôi đang cố nhập a.go vào bên trong b.go. Tôi đã thử những điều sau đây,

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

Không có cái nào trong số này hiệu quả cả..Tôi hiểu rằng tôi phải can thiệp vào GOPATH nhưng tôi không thể làm đúng. Hiện tại GOPATH của tôi đang trỏ đến samplego (/ workspace / samplego). Tôi gặp lỗi bên dưới

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

Ngoài ra, GOPATH hoạt động như thế nào khi các tệp nguồn này được nhập vào một dự án / mô-đun khác? Nhập khẩu trong nước có phải là một vấn đề sau đó không? Cách tốt nhất trong trường hợp này là gì - đó là chỉ có một tệp đi trong mô-đun (với các bài kiểm tra liên quan)?


Bất kỳ số lượng tệp nào trong một thư mục đều là một phần của cùng một gói ngay từ đầu. (Và họ cần phải có cùng một package atuyên bố ở trên cùng.)
twotwotwo

Cảm ơn @twotwotwo ... Bạn có thể cho tôi biết cách giải quyết vấn đề trên không? Ngoài ra, khi chúng ta có các tệp multipe go trong một gói thì việc nhập sẽ theo đường dẫn đầy đủ, ví dụ. github.com/xxxx/a or just a
will

Đối với mô-đun Go, các tệp trong cùng một thư mục vẫn là một phần của cùng một gói, vẫn cần có cùng tên gói (ví dụ package foo:) và vẫn không cần nhập trực tiếp lẫn nhau. Đây câu trả lời bao gồm này một chút nhiều hơn cho Go mô-đun, bao gồm cách nhập gói trong cùng một module dưới Go mô-đun.
điển hình182

Câu trả lời:


76

Bất kỳ số lượng tệp nào trong một thư mục đều là một gói duy nhất; các ký hiệu được khai báo trong một tệp có sẵn cho các tệp khác mà không có bất kỳ imports hoặc định nghĩa nào. Tất cả các tệp cần có cùng một package fookhai báo ở trên cùng (nếu không bạn sẽ gặp lỗi từ go build).

Bạn cần GOPATHthiết lập để thư mục nơi bạn pkg, srcbinthư mục cư trú. Đây chỉ là vấn đề tùy chọn, nhưng thông thường sẽ có một không gian làm việc duy nhất cho tất cả các ứng dụng của bạn (đôi khi $HOME), không phải một không gian cho mỗi ứng dụng.

Thông thường, một đường dẫn Github sẽ là github.com/username/reponame(không chỉ github.com/xxxx). Vì vậy, nếu bạn muốn có mainvà một gói khác, bạn có thể làm điều gì đó workspace/srcnhư

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

Lưu ý rằng bạn luôn nhập với github.com/...đường dẫn đầy đủ : nhập tương đối không được phép trong không gian làm việc. Nếu bạn cảm thấy mệt mỏi với các đường dẫn nhập, hãy sử dụng goimports. Nếu bạn đang sử dụng go run, đã đến lúc chuyển sang go build: runxử lý kém với nhiều tệp mainvà tôi không thèm kiểm tra nhưng nghe nói (từ Dave Cheney ở đây ) go runkhông xây dựng lại các phụ thuộc bẩn.

Có vẻ như ít nhất bạn đã cố gắng đặt GOPATH thành đúng, vì vậy nếu bạn vẫn gặp khó khăn, có thể bao gồm chính xác cách bạn đặt biến môi trường (lệnh, v.v.) và lệnh bạn đã chạy và lỗi gì đã xảy ra. Dưới đây là hướng dẫn về cách thiết lập nó (và làm cho cài đặt liên tục) trong Linux / UNIXđây là lời khuyên của nhóm Go về thiết lập không gian làm việc . Có thể không có ích gì, nhưng hãy xem và ít nhất chỉ ra phần nào khiến bạn bối rối nếu bạn đang bối rối.


1
goimports khá hữu ích :)
g0c00l.g33k

Nếu bạn gặp sự cố khi chạy nhiều tệp trong gói chính, hãy xem câu trả lời này .
Rick Smith

Tôi đã thêm cùng một package mainkhai báo cho tất cả các tệp trong cùng một thư mục, nhưng tôi gặp undefinedlỗi, main.gokhông thể xem các hàm từ tệp controllers.gonằm trong cùng một thư mục.
ame

2
@AlexChaliy Nếu đang sử dụng go run, bạn có thể cần phải chuyển rõ ràng cả hai tên tệp cho nó hoặc chuyển sang đặt chúng trong một gói trong GOPATH của bạn và nhập go buildnó. Đồng thời kiểm tra kỹ các lỗi phổ biến không liên quan đến cấu trúc gói (như tên bị đánh máy). Nếu không có cách nào giải quyết được nó, tôi sẽ mở một câu hỏi mới với tất cả các chi tiết bạn có thể; Có thể cần nhiều cuộc thảo luận về cách giải quyết chính xác cách tệp, tệp, v.v. của bạn trông như thế nào và vì nó sẽ đặc biệt về thiết lập của bạn, một câu hỏi mới có vẻ như là địa điểm tốt nhất cho điều đó.
twotwotwo

40

Không cần nhập khẩu miễn là bạn khai báo cả hai a.gob.goở trong cùng một gói. Sau đó, bạn có thể sử dụng go runđể nhận ra nhiều tệp với:

$ go run a.go b.go

14

./main.go (trong gói chính)
./a/a.go (trong gói a)
./a/b.go (trong gói a)

trong trường hợp này:
main.go import "./a"

Nó có thể gọi hàm trong a.go và b.go, với chữ cái đầu tiên được viết hoa.


0

Tôi chỉ muốn một cái gì đó thực sự cơ bản để chuyển một số tệp ra khỏi thư mục chính, như câu trả lời của user2889485, nhưng câu trả lời cụ thể của anh ấy không phù hợp với tôi. Tôi không quan tâm nếu chúng có trong cùng một gói hay không.

Không gian làm việc GOPATH của tôi c:\work\govà dưới đó tôi có

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

trong main.gotôi import "/pg/dbtypes"

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.