假設您有一個mypack包含兩個源文件mypack/a.go和mypack/b.go. 這兩個源文件相互依賴,但 Go 編譯器不會報錯。如果你將該包分成兩個,apack/a.go和bpack/b.go,Go 編譯器會說import cycle not allowed。我對如何處理包依賴關系的理解是,編譯器將構建一個導入圖。對圖表進行了分析,并以某種方式(我很想了解執行此操作的算法?。┯嬎懔司幾g順序。如果圖中有環,則無法計算順序,因此編譯器會報錯。我不明白的是 Go 編譯器如何能夠解決包源之間的依賴關系但無法解決包之間的依賴關系。如果這兩個來源相互依賴,那么你必須做一些瘋狂的雜技并以某種方式同時編譯它們。有人可以幫我解決這個問題嗎?
2 回答

回首憶惘然
TA貢獻1847條經驗 獲得超11個贊
[...] Go 編譯器如何能夠解決包源之間的依賴關系但無法解決包之間的依賴關系。如果這兩個來源相互依賴,那么你必須做一些瘋狂的雜技并以某種方式同時編譯它們。
這個問題是基于對 Go 代碼的結構和編譯方式的錯誤假設:源文件沒有 定義的依賴關系。包具有依賴性(所有從其所有源文件導入)。依賴項是包(不是源文件)。要編譯一個包,所有依賴項都必須在編譯開始之前可用。
您真的必須停止考慮源文件。源文件(幾乎)對 Go 代碼的編譯方式沒有任何意義。一個包的源可能由一個或多個源文件組成,這基本上是源文件進入編譯 Go 代碼的唯一點。一切相關的事情都圍繞著包和包:你編譯包,你導入包,等等。
(只是為了完整性:構建標簽在源代碼級別工作,包初始化可以依賴于源代碼組織,通過手動調用 gc 你可以做的比通過 go 工具做的更多。)

慕標5832272
TA貢獻1966條經驗 獲得超4個贊
無論使用多少源文件,一個包都被編譯為一個單元。這真的不應該那么神秘。
此外,您關于“如果存在循環則無法計算訂單”的斷言是完全錯誤的。計算這些東西是微不足道的——許多語言都這樣做。不過,作為政策問題,Go 禁止這樣做,因為它會導致代碼的緊密耦合和難以理解的代碼,而不是因為它是不可能的。
- 2 回答
- 0 關注
- 176 瀏覽
添加回答
舉報
0/150
提交
取消