我正在使用一個 golang 包,比如 name pkgfoo;而作者明確表示,如果我們想用一個包subpkg下pkgfoo,我需要明確進口subpkg。我不明白背后的原因。如果我在Golang中導入頂級pkg,subpkg不會自動導入嗎?package mainimport ( "myownpackage" "github.com/usera/pkgfoo" "github.com/usera/pkgfoo/subpkg")func main() { // Use functions in pkgfoo, and use functions in pkgfoo/subpkg // ...... http.HandleFunc("/login", login) err := http.ListenAndServe(":9090", nil) // setting listening port if err != nil { log.Fatal("ListenAndServe: ", err) }}我的問題是我是否真的需要import "github.com/usera/pkgfoo/subpkg"聲明。
1 回答

蝴蝶不菲
TA貢獻1810條經驗 獲得超4個贊
Go 包由一個或多個源文件構成,這些源文件被組織到文件系統中的文件夾中。同一個包的源文件必須在同一個文件夾中。
但是在 Go 中沒有“包層次結構”,“子包”術語只是指一個包的文件夾是另一個包的子文件夾。我們經常將包組織到作為其他子文件夾的文件夾中,因為這些包之間存在某種聯系(例如,一個包僅由父文件夾中的另一個存在使用;或者子文件夾中的包是特定的或更特殊的實現包在父文件夾中;或者只是一個邏輯分組 - 請參閱答案的結尾)。
所以每當你這樣做
import "github.com/usera/pkgfoo"
它只導入pkgfoo,沒有其他包與前綴共享相同的路徑。如果您github.com/usera/pkgfoo/subpkg也需要,您還需要顯式導入它:
import (
"github.com/usera/pkgfoo"
"github.com/usera/pkgfoo/subpkg"
}
Go 博客:標準庫中使用的目錄上的包名稱:
目錄。標準庫使用類似目錄、、、crypto和container來對相關協議和算法的包進行分組encoding。image這些目錄之一中的包之間沒有實際關系;目錄只是提供了一種排列文件的方法。只要導入不會創建循環,任何包都可以導入任何其他包。
- 1 回答
- 0 關注
- 166 瀏覽
添加回答
舉報
0/150
提交
取消