我已經閱讀了涵蓋這個問題的各種文章,并且有很多不同的方法。我是 Go 的新手,我正在努力學習最佳實踐,而不是一開始就選擇一些不好的風格。來自有課程的語言,我在學習 Go 等新語言時盡量不應用我多年來學到的一切。這提出了我的第一點:在 Go 中使用包和文件夾來組織你的程序是否被認為是一種好風格?從我到目前為止所讀到的內容來看,有些人建議這樣做,所以我選擇了這樣的結構(我的實際程序要大得多,因此符合“將代碼移動到包”的方法):.├── bin│ └── helloworld└── src ├── github.com │ ├── SOMEUSER │ │ └── helloworld │ │ ├── main.go │ │ ├── main_test.go │ │ ├── greeter │ │ │ └── talker.go │ │ └── person.go因此,如您所見,我將一些新代碼移到了一個單獨的包中,在這種情況下將是greeter. 我在我的 main.go 文件中導入了這個包(我已經多次閱讀,建議使用這種方法而不是像 那樣進行導入import ./greeter):package mainimport "github.com/SOMEUSER/helloworld/greeter"func main() { greeter.Hello()}然后調用Hello()我的greeter包中的函數。到現在為止還挺好。但是我的實際問題來了(假設上述結構是在 Go 中構建代碼的推薦方式):我現在如何使用在我的main包中的任何文件中聲明的任何函數、結構等(在這里我有一些嚴重的懷疑,這是否是要走的路,沒有雙關語)?所以讓我們假設我在person.go調用中聲明了一些結構Person。這個結構現在在我的應用程序的幾個部分使用,最好也在我包含的(本地)包中使用它,如下所示:package greeterimport "fmt"func Hello() { p := Person{Name: "Steve"} fmt.Println(p.Name)}嘗試構建它時,它會引發undefined: Person錯誤。如果您能指出我正確的方向,并就 Go 中推薦的方法和風格啟發我,我將非常感激。
2 回答

皈依舞
TA貢獻1851條經驗 獲得超3個贊
要使用Person
結構體,您需要導入github.com/SOMEUSER/helloworld
包并像main.Person
. 但是,這是不可能的,因為您無法導入main
包并且會創建循環依賴。
通常,我將以下代碼導出到子包中:
與包完全無關的助手
獨立的部分,可能是第三方庫
相關但不依賴
main
代碼的部分
現在,請記住,這確實是一個復雜性問題。擁有許多文件但低復雜性并不能證明子包的合理性。

莫回無
TA貢獻1865條經驗 獲得超7個贊
這里有兩個“解決方案”。
1) 將代碼放回主包中,直到您知道如何處理它為止(這是我的建議)
2) 創建一個定義 Person 類型的 person 包并將該包導入到兩者中。我認為 person.Person 很傻,這就是為什么我不會這樣做。database.Person 或 server.Person 對我來說更有意義。我的意思是在這一點上,這一切都歸結為你如何閱讀、寫作和存儲 Person,這還不清楚。
- 2 回答
- 0 關注
- 206 瀏覽
添加回答
舉報
0/150
提交
取消