是否有可能默认不包含子目录中的Golang包?

时间:2016-06-17 06:01:13

标签: go

我正在使用一个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"声明。

1 个答案:

答案 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标准库中使用的目录:

  

目录。标准库使用类似目录cryptocontainerencodingimage来对相关协议和算法的包进行分组。其中一个目录中的包之间没有实际关系;目录只提供了一种排列文件的方法。任何包都可以导入任何其他包,前提是导入不会创建循环。