fungsi “undefined” golang dinyatakan dalam file lain?

135

Saya mencoba untuk menulis program dasar yang memanggil fungsi pada file yang berbeda, tetapi merupakan bagian dari paket yang sama. Namun, ia mengembalikan:

undefined: NewEmployee

Ini kode sumbernya:

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!"
}
Juan M.
sumber
apakah file Anda memiliki pernyataan paket? Apa yang Anda ketikkan tidak memiliki package x, juga paket utama Anda biasanya hanya berisi satu file, lalu mengimpor bagian lain yang diperlukan
Chris Pfohl
8
yang Anda gunakan go run? (dan lihat golang.org/doc/code.html )
JimB
1
@ JuanM, pertanyaan saya adalah apakah sumber lengkapmain.go dan employee.go? Karena semua file go seharusnya memiliki pernyataan paket, dan saya tidak melihat ada di Anda. Lihat: golang.org/doc/code.html#PackageNames
Chris Pfohl
1
Fungsi terakhir dari employee.go salah (tidak ada nama fungsi, tidak ada tipe pengembalian yang dideklarasikan). Bukan masalah yang Anda minta, tetapi itu menunjukkan bahwa ada lebih banyak masalah. Bisakah Anda memposting kode lengkap dan kesalahan lengkap saat kompilasi?
siritinga
1
kemudian tunjukkan kepada kami apa yang Anda lakukan! GOPATH, kode aktual, dan cara Anda menjalankan goalat.
JimB

Jawaban:

172

Silakan baca "Cara Menulis Kode Pergi" .

Jangan gunakan /srcdi Anda GOPATH. Paket berada di $GOPATH/src.

Untuk buildatau installAnda perlu memiliki file Anda di direktori paket.

Untuk go run, Anda perlu menyediakan semua file sebagai argumen:

go run main.go employee.go

Tapi, Anda hampir selalu harus menggunakan go install, atau go build(dan lebih disukai yang pertama, karena go buildmenyebabkan kebingungan ketika bekerja dengan paket non-utama)

JimB
sumber
terima kasih atas input @ JimB! Saya mengedit variabel lingkungan (saya juga lupa mengatur GOBIN), memindahkan file-file saya ke lokasi yang benar, tetapi masih ketika saya mencoba masuk ke instal saya mendapatkan kesalahan yang sama. Ada saran?
Juan M
Apakah Anda yakin tidak ada kesalahan lain? File employee.go Anda tidak dapat dikompilasi seperti apa adanya. Kalau tidak, saya perlu melihat persis apa yang Anda lakukan. Jalur yang tepat, doa, dll.
JimB
8
Atau jangan $ jalankan * .go
Puran
melakukan run $ go run *.goakan menjadi jalan pintas alih-alih menjalankan semua file
offerni
60

Saya baru saja mengalami masalah yang sama di GoLand (yaitu Intellij IDEA for Go) dan mencari solusinya. Anda perlu mengubah Run kinddari Fileke Packageatau Directory. Anda dapat memilih ini dari drop-down jika Anda masuk ke Run/EditKonfigurasi.

Misalnya: untuk paket ~/go/src/a_package, gunakan a Package pathdari a_packagedan a Directorydari ~/go/src/a_packagedan Run kinddari Packageatau Directory.

Andrew W. Phillips
sumber
1
Terima kasih, ini yang saya cari. Harap sebutkan bahwa jawaban Anda adalah tentang Intellij IDEA.
kivagant
12

Jika Anda menggunakan go run, lakukan go run *.go. Ini akan secara otomatis menemukan semua file go di direktori kerja saat ini, kompilasi dan kemudian jalankan fungsi utama Anda.

Paul Razvan Berg
sumber
Apakah ada kejatuhan untuk melakukannya dengan cara ini? Ini sepertinya jawaban paling sederhana untuk pertanyaan OP.
Stavros_S
Solusi yang lebih umum di bawah Bash: go run !(*_test).go- Golang: jalankan semua file .go dalam direktori saat ini melalui baris perintah (paket multi-file)
Brent Bradburn
8

Anda dapat mencoba salah satu dari berikut ini.

Metode 01 : anggap nama proyek AndaMyProject

  • pergi ke jalur Anda, ketik go builddan tekan enter.
  • itu akan membuat file yang dapat dieksekusi sebagai nama proyek Anda ("MyProject")
  • kemudian pada tipe terminal Anda ./MyProjectdan tekan enter

Anda bisa melakukan kedua langkah sekaligus dengan mengetik go build && ./MyProject. itu akan menjalankan proyek Anda dengan benar dengan semuago file.

Metode 02

cukup ketik go run *.godan tekan enter. ini akan menjalankan semua go files.

Semoga ini bisa membantu seseorang.

Kaldera Chanaka
sumber
4

Jika Anda ingin memanggil fungsi dari file go lain dan Anda menggunakan Goland, kemudian temukan opsi 'Edit konfigurasi' dari menu Run dan ubah jenis run dari File ke Direktori. Ini menghapus semua kesalahan dan memungkinkan Anda untuk memanggil fungsi dari file go lainnya.

Puneet Tokhi
sumber
1

Saya mengalami masalah yang sama dengan Go11 , hanya ingin berbagi bagaimana saya menyelesaikannya untuk membantu orang lain kalau-kalau mereka mengalami masalah yang sama.

Saya memiliki proyek Go saya di luar $GOPATH , jadi saya harus dihidupkan GO111MODULE=ontanpa opsi ini dihidupkan, itu akan memberi Anda masalah ini; bahkan jika Anda mencoba membangun atau menguji keseluruhan packageatau directoryitu tidak akan diselesaikan tanpaGO111MODULE=on

Muhammad Soliman
sumber
1

Anda harus menggunakan modul go sekarang, jika Anda tidak mengikuti cara menulis kode go

Dengan modul go, Anda tidak harus memasukkan kode ke dalam $ GOPATH / src. itu dapat hidup di lokasi lain juga.

Anda dapat memindahkan kode ke direktori yang berbeda seperti / karyawan, Untuk membuatnya berfungsi Tepat di bawah direktori karyawan inisialisasi modul go

go mod init example.com/employee
Jeetsang
sumber
0

Jika folder sumber Anda terstruktur / go / src / blog (dengan asumsi nama folder sumber Anda adalah blog).

  1. cd / go / src / blog ... (cd di dalam folder yang berisi paket Anda)
  2. pergi instal
  3. blog

Itu harus menjalankan semua file Anda secara bersamaan, alih-alih Anda harus membuat daftar file secara manual atau "memukul" metode pada baris perintah.

Druhin Bala
sumber
0

go run .akan menjalankan semua file Anda. Titik masuk adalah fungsi main()yang harus unik untuk mainpaket.

Pilihan lain adalah dengan membangun biner go builddan menjalankannya.

Miguel Reyes
sumber
0

Cukup gunakan perintah go run *.gountuk menjalankan semua file go dalam paket Anda!

d0zingcat
sumber
Jawabannya seperti @ Paul Razvan Berg jawab
Chris Catignani