2014-11-15 26 views
27

Yerel bir dosyayı başka bir dosyaya içe aktarmada zorluk yaşıyorum.Aynı klasördeki dosyaları içe aktarma

Projem yapısı ben b.go. içeride a.go almak için çalışıyorum

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

altında bir şey gibi olduğunu Ben aşağıdaki çalıştı, bu worked..I ait

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

Yok ben GOPATH ile karışmak zorunda anlıyorum ama doğru alamadım. Halen benim GOPATH aşağıda hatayı Ayrıca

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

olsun .Ben (/ çalışma/samplego) samplego işaret ediyor, bu kaynak dosyaları başka proje/modüle GOPATH çalışma ithal ne zaman nasıl? Yerel ithalatlar o zaman sorun olur mu? Bu durumda en iyi uygulama hangisidir - modülde tek bir go dosyasına sahip olmak (ilgili testlerle)?

+0

bir dizindeki dosyaların herhangi bir sayıda baştan aynı paketin bir parçasıdır. (Ve onlar da aynı '' pakette 'deklarasyonunun olması gerekiyor.' – twotwotwo

+0

Teşekkürler @twotwotwo ... Yukarıdaki sorunu nasıl çözeceğimi bana bildirir misiniz? Ayrıca, bir paketteki çoklu dosyalara sahip olduğumuzda, içe aktarma tam yolu takip etmelidir. github.com/xxxx/a ya da sadece bir –

cevap

28

Dizindeki herhangi bir sayıda dosya tek bir pakettir; Bir dosyada bildirilen semboller, herhangi bir import s veya niteleyici olmaksızın diğerlerine sunulmuştur. Tüm dosyaların üstte aynı package foo beyanına ihtiyacı vardır (veya go build'dan bir hata alırsınız).

pkg, src ve dizinlerinin bulunduğu dizine ayarlamak için GOPATH gerekir. Bu sadece bir tercih meselesidir, ancak uygulama başına bir değil, tüm uygulamalarınız için tek bir çalışma alanına (bazen $HOME) sahip olmak yaygındır.

Normal olarak bir Github yolu github.com/username/reponame (sadece github.com/xxxx değil) olur. göreli ithalat bir çalışma alanında izin verilmez: Eğer main ve başka bir paket yapmak istiyorsanız Yani, her zaman tam github.com/... yolu ile içe

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

Not gibi workspace/src altında bir şey yapmak zorunda kalabilirler. Yazma yollarından sıkılırsanız, goimports'u kullanın. go run ile karşılaşıyor olsaydınız,: run anlaşmalarına geçme zamanı çok sayıda dosya main s'ye geçme zamanı geldi ve sınamakla uğraşmadım ama duymadım (Dave Cheney here'dan) go run kirli bağımlılıkları yeniden oluşturmuyor.

GOPATH'ı en doğru şekilde ayarlamayı denediğiniz gibi geliyor, bu yüzden hala takılı kalıyorsanız, ortam değişkenini tam olarak nasıl ayarlayacağınızı (komut vb.) Ve hangi komutu çalıştırdığınızı ve ne hata oldu Here are instructions on how to set it (and make the setting persistent) under Linux/UNIX ve here is the Go team's advice on workspace setup. Belki de yardımcı olmuyor, ama en azından kafanız karıştığında hangi bölümün sizi şaşırtdığını gösteriyor. (Bir paket içinde) (paket içinde)
./a/b.go
./a/a.go (ana paket içinde)

+1

goimports yapmak oldukça yararlı oldu :) –

+0

Ana pakette birden fazla dosya çalıştırmakta sorun yaşıyorsanız, [bu yanıt] 'a bakın (http://stackoverflow.com/a/28081554/616.644). –

8

./main.go

Bu durumda: main.go import "./a"

Bu işlev, ilk harfle açık olan a.go ve b.go işlevlerini çağırabilir.

0

Aynı pakette hem a.go hem de b.go bildirimini kabul ettiğiniz sürece hiçbir ithalat gerekli değildir. Ardından, birlikte birden fazla dosya tanımak için go run kullanabilirsiniz:

$ go run a.go b.go 
+0

Bu, sorunun cevabını sağlamaz. Yeterli [itibara] sahip olduğunuz zaman (https://stackoverflow.com/help/whats-reputation) herhangi bir gönderiye yorum yapabilirsiniz (https://stackoverflow.com/help/privileges/comment); bunun yerine, [askerden açıklama istemeyen cevaplar verin] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-yerine). - [Yorum Yaz] (/ review/düşük kaliteli yazılar/19039597) –

İlgili konular