Meskipun jawaban yang diterima masih benar tentang perlunya mencocokkan direktori dengan nama paket, Anda benar-benar perlu bermigrasi untuk menggunakan modul Go alih-alih menggunakan GOPATH. Pengguna baru yang mengalami masalah ini mungkin bingung tentang sebutan untuk menggunakan GOPATH (seperti dulu), yang sekarang sudah ketinggalan zaman. Jadi, saya akan mencoba untuk mengatasi masalah ini dan memberikan panduan yang terkait dengan mencegah masalah ini saat menggunakan modul Go.
Jika Anda sudah terbiasa dengan modul Go dan mengalami masalah ini, lewati ke bagian yang lebih spesifik di bawah ini yang mencakup beberapa konvensi Go yang mudah diabaikan atau dilupakan.
Panduan ini mengajarkan tentang modul Go: https://golang.org/doc/code.html
Organisasi proyek dengan modul Go
Setelah Anda bermigrasi ke modul Go, seperti yang disebutkan dalam artikel itu, atur kode proyek seperti yang dijelaskan:
Repositori berisi satu atau lebih modul. Modul adalah kumpulan paket Go terkait yang dirilis bersamaan. Repositori Go biasanya hanya berisi satu modul, yang terletak di akar repositori. File bernama go.mod di sana mendeklarasikan jalur modul: awalan jalur impor untuk semua paket di dalam modul. Modul ini berisi paket-paket dalam direktori yang berisi file go.mod dan juga subdirektori dari direktori itu, hingga subdirektori berikutnya yang berisi file go.mod lain (jika ada).
Setiap jalur modul tidak hanya berfungsi sebagai awalan jalur impor untuk paket-paketnya, tetapi juga menunjukkan di mana perintah go harus mencari untuk mengunduhnya. Misalnya, untuk mengunduh modul golang.org/x/tools, perintah go akan berkonsultasi dengan repositori yang ditunjukkan oleh https://golang.org/x/tools (dijelaskan lebih lanjut di sini).
Jalur impor adalah string yang digunakan untuk mengimpor paket. Jalur impor paket adalah jalur modul yang digabungkan dengan subdirektori dalam modul. Misalnya, modul github.com/google/go-cmp berisi paket di direktori cmp /. Jalur impor paket itu adalah github.com/google/go-cmp/cmp. Paket di perpustakaan standar tidak memiliki awalan jalur modul.
Anda dapat menginisialisasi modul Anda seperti ini:
$ go mod init github.com/mitchell/foo-app
Kode Anda tidak perlu berada di github.com untuk membuatnya. Namun, ini adalah praktik terbaik untuk menyusun modul-modul Anda seolah-olah modul-modul itu pada akhirnya akan diterbitkan.
Memahami apa yang terjadi ketika mencoba untuk mendapatkan paket
Ada artikel bagus di sini yang membahas tentang apa yang terjadi ketika Anda mencoba untuk mendapatkan paket atau modul: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16
Ini membahas di mana paket disimpan dan akan membantu Anda memahami mengapa Anda mungkin mendapatkan kesalahan ini jika Anda sudah menggunakan modul Go.
Pastikan fungsi yang diimpor telah diekspor
Perhatikan bahwa jika Anda mengalami kesulitan mengakses suatu fungsi dari file lain, Anda perlu memastikan bahwa Anda telah mengekspor fungsi Anda. Seperti dijelaskan dalam tautan pertama yang saya berikan, fungsi harus dimulai dengan huruf besar yang akan diekspor dan tersedia untuk diimpor ke paket lain.
Nama direktori
Detail penting lainnya (seperti yang disebutkan dalam jawaban yang diterima) adalah bahwa nama direktori adalah apa yang menentukan nama paket Anda. (Nama paket Anda harus mencocokkan nama direktori mereka.) Anda dapat melihat contoh ini di sini: https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc
Dengan yang mengatakan, file yang berisi main
metode Anda (yaitu, titik masuk aplikasi Anda) agak dikecualikan dari persyaratan ini.
Sebagai contoh, saya mengalami masalah dengan impor saya saat menggunakan struktur seperti ini:
/my-app
├── go.mod
├── /src
├── main.go
└── /utils
└── utils.go
Saya tidak dapat mengimpor kode utils
ke dalam main
paket saya .
Namun, begitu saya menempatkan main.go
subdirektori sendiri, seperti yang ditunjukkan di bawah ini, impor saya bekerja dengan baik:
/my-app
├── go.mod
├── /src
├── /app
| └── main.go
└── /utils
└── utils.go
Dalam contoh itu, file go.mod saya terlihat seperti ini:
module git.mydomain.com/path/to/repo/my-app
go 1.14
Ketika saya menyimpan main.go setelah menambahkan referensi utils.MyFunction()
, IDE saya secara otomatis menarik referensi ke paket saya seperti ini:
import "git.mydomain.com/path/to/repo/my-app/src/my-app"
(Saya menggunakan VS Code dengan ekstensi Golang.)
Perhatikan bahwa jalur impor menyertakan subdirektori ke paket.
Berurusan dengan repo pribadi
Jika kode tersebut merupakan bagian dari repo pribadi, Anda perlu menjalankan perintah git untuk mengaktifkan akses. Jika tidak, Anda dapat menemukan kesalahan lain. Artikel ini menyebutkan cara melakukan itu untuk repositori pribadi Github, BitBucket, dan GitLab: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositories-dfe795068db4
Masalah ini juga dibahas di sini: Apa cara yang tepat untuk "mendapatkan" repositori pribadi?