我正在使用一个 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 关注
- 141 浏览
添加回答
举报
0/150
提交
取消