golang "tanımsız" işlevi başka bir dosyada mı ilan edildi?


136

Farklı bir dosyada bir işlevi çağıran, ancak aynı paketin bir parçası olan basit bir go programı yazmaya çalışıyorum. Ancak şunu döndürür:

undefined: NewEmployee

İşte kaynak kodu:

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

dosyalarınızda paket ifadeleri var mı? Yazdıklarınızda bir yok package x, ayrıca ana paketiniz genellikle yalnızca tek bir dosya içeriyor ve ardından ihtiyaç duyduğu diğer parçaları içe
aktarıyor

8
kullanıyor go runmusun (ve bakınız golang.org/doc/code.html )
JimB

1
@JuanM, sorum şuydu, tam kaynağı main.gove employee.go? Çünkü tüm go dosyalarının bir paket ifadesi olması gerekiyor ve ben sizinkinde hiç görmüyorum. Bakınız: golang.org/doc/code.html#PackageNames
Chris Pfohl

1
Employee.go işlevinin son işlevi yanlış (işlev adı yok, dönüş türü bildirilmedi). Sorduğunuz sorun bu değil ama daha çok sorun olduğunu gösteriyor. Derleme sırasında kodun tamamını ve hatanın tamamını gönderebilir misiniz?
siritinga

1
o zaman bize ne yaptığını göster! GOPATH, gerçek kod ve goaracı nasıl çağırdığınız .
JimB

Yanıtlar:


173

Lütfen "Go Kodu Nasıl Yazılır " bölümünü okuyun .

Senin /srciçinde kullanmayın GOPATH. Paketler bulunur $GOPATH/src.

İçin buildveya installdosyalarınızı bir paket dizininde bulundurmanız gerekir.

İçin go run, tüm dosyaları bağımsız değişken olarak sağlamanız gerekir:

go run main.go employee.go

Ancak, hemen hemen her zaman go installveya go build(ve tercihen ilkini, go buildana olmayan paketlerle çalışırken kafa karışıklığına neden olduğu için) kullanmalısınız.


@JimB girdiniz için teşekkürler! Ortam değişkenlerini düzenledim (ayrıca GOBIN'i ayarlamayı unutmuştum), dosyalarımı doğru konuma taşıdım, ancak yine de kurulum yapmaya çalıştığımda aynı hatayı alıyorum. Baska öneri?
Juan M

Başka hata olmadığına emin misin? Employee.go dosyanız olduğu gibi derlenemez. Aksi takdirde, tam olarak ne yaptığını görmem gerek . Kesin yollar, çağrı vb.
JimB

8
Veya $ go run * .go yapın
Puran

run yapıyor $ go run *.goyerine tüm dosyaları çalışan bir kısayol olacaktır
offerni

61

Aynı sorunu GoLand'da (Intellij IDEA for Go) yaşadım ve bir çözüm buldum. Sen değiştirmeniz gerekir Run kinddan Fileetmek Packageveya Directory. Run/EditYapılandırmalara giderseniz bunu bir açılır menüden seçebilirsiniz .

Ör: Paket için ~/go/src/a_packagebir kullanmak Package pathait a_packageve Directoryiçinde ~/go/src/a_packageve Run kindarasında Packageveya Directory.


1
Teşekkür ederim, aradığım şey buydu. Lütfen cevabınızın Intellij IDEA hakkında olduğunu belirtin.
kivagant

13

Eğer kullanıyorsanız go run, yapın go run *.go. Geçerli çalışma dizinindeki tüm go dosyalarını otomatik olarak bulur, derler ve ardından ana işlevinizi çalıştırır.


Bunu bu şekilde yapmanın herhangi bir olumsuz yönü var mı? Bu, OP'lerin sorusuna verilen en basit cevap gibi görünüyor.
Stavros_S


8

Aşağıdakilerden birini deneyebilirsiniz:

Yöntem 1 :

  • Proje adınızın olduğunu varsayın MyProject
  • Yoluna git, koş go build
  • Proje adınız olarak çalıştırılabilir bir dosya oluşturacaktır ("Projem")
  • Ardından çalıştırılabilir dosyayı kullanarak çalıştırın. ./MyProject

Yazarak her iki adımı da aynı anda yapabilirsiniz go build && ./MyProject. Go dosyaları package mainbir yürütülebilir dosyada derlenir.

Yöntem 2 :

  • Sadece koş go run *.go. Herhangi bir yürütülebilir dosya oluşturmaz, ancak çalışır.

3

Başka bir go dosyasından bir işlev çağırmak istiyorsanız ve Goland kullanıyorsanız, Çalıştır menüsünden 'Yapılandırmayı düzenle' seçeneğini bulun ve çalıştırma türünü Dosya'dan Dizine değiştirin. Tüm hataları temizler ve diğer go dosyalarından işlevleri çağırmanıza izin verir.


1

Aynı sorunla karşılaştım Go11, sadece aynı sorunla karşılaşırlarsa başkalarına yardım etmek için nasıl çözdüğümü paylaşmak istedim.

Go projemi dışarıda $GOPATH tuttum, bu yüzden GO111MODULE=onbu seçeneği açmadan açmak zorunda kaldım , size bu sorunu verecek; Eğer yapı deneyin veya tüm test edildiğinde bile eğer packageyoksa directoryo olmadan çözülemeyeceğiGO111MODULE=on


1

go run .tüm dosyalarınızı çalıştıracak. Giriş noktası, pakete main()özgü olması gereken işlevdir main.

Diğer bir seçenek de ikili dosyayı oluşturmak go buildve çalıştırmaktır.


Eski go projemi yürütmek ve nasıl koşacağımı unutmak için bir süredir kaldım. Sonunda cevabınla buldum. Bu olumlu bir cevap olmalıdır!
moondaddi

1

Şimdi go modüllerini kullanmalısınız , eğer git kodu yazmayı takip etmiyorsanız

Go modülü ile kodu $ GOPATH / src içine koymanız gerekmez. başka herhangi bir yerde de yaşayabilir.

Kodu / worker gibi farklı bir dizine taşıyabilirsiniz, Çalışmasını sağlamak için Hemen çalışan dizininin altında go modülünü başlatın

go mod init example.com/employee


-1

Kaynak klasörünüz yapılandırılmışsa / go / src / blog (kaynak klasörünüzün adının blog olduğu varsayılarak).

  1. cd / go / src / blog ... (paketinizin bulunduğu klasörün içindeki cd)
  2. git yükle
  3. Blog

Bu, dosyaları manuel olarak listelemek veya komut satırında bir yöntemi "dayatmak" yerine, tüm dosyalarınızı aynı anda çalıştırmalıdır.


Ve işte bir de dijital okyanus makalesi: digitalocean.com/community/tutorials/…
Druhin Bala
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.