我正在使用一个golang包,比如说pkgfoo
;并且作者明确表示如果我们想在subpkg
下使用包pkgfoo
,我需要显式导入subpkg。我不明白其背后的原因。如果我在Golang中导入顶部pkg,是不是会自动导入subpkg?
package main
import (
"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"
声明。
答案 0 :(得分:2)
Go包由一个或多个源文件构成,这些源文件被组织到文件系统中的文件夹中。同一个包的源文件必须位于同一个文件夹中。
但是在Go中没有"包层次结构"," subpackage"术语只是指包的文件夹是另一个的子文件夹。我们经常将软件包组织在文件夹中作为其他软件的子文件夹,因为这些软件包之间存在某种连接(例如,软件包仅由另一个软件包在父文件夹中使用;或者子文件夹中的软件包是特定的或更特殊的实现。包在父文件夹中;或者只是一个逻辑分组 - 请参阅答案的结尾。)
所以每当你做
import "github.com/usera/pkgfoo"
它只导入pkgfoo
,并且没有其他包与前缀共享相同的路径。如果您还需要github.com/usera/pkgfoo/subpkg
,还需要明确导入它:
import (
"github.com/usera/pkgfoo"
"github.com/usera/pkgfoo/subpkg"
}
The Go Blog: Package names标准库中使用的目录:
目录。标准库使用类似目录
crypto
,container
,encoding
和image
来对相关协议和算法的包进行分组。其中一个目录中的包之间没有实际关系;目录只提供了一种排列文件的方法。任何包都可以导入任何其他包,前提是导入不会创建循环。