是否可能默认情况下不包括SubDR中的Golang包?

是否可能默认情况下不包括SubDR中的Golang包?,go,Go,我使用的是一个golang包,比如namepkgfoo;作者明确表示,如果我们想在pkgfoo下使用包subpkg,我需要显式导入subpkg。我不明白背后的原因。如果我在Golang导入顶级包装,子包装不是自动导入的吗 package main import ( "myownpackage" "github.com/usera/pkgfoo" "github.com/usera/pkgfoo/subpkg" ) func main() { // Use f

我使用的是一个golang包,比如name
pkgfoo
;作者明确表示,如果我们想在
pkgfoo
下使用包
subpkg
,我需要显式导入subpkg。我不明白背后的原因。如果我在Golang导入顶级包装,子包装不是自动导入的吗

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)
    }
}

我的问题是我是否真的需要
导入“github.com/usera/pkgfoo/subpkg”
语句。

Go包是从一个或多个源文件构建的,这些源文件被组织到文件系统中的文件夹中。同一程序包的源文件必须位于同一文件夹中

但在Go中没有“包层次结构”,“子包”术语只是指一个包的文件夹是另一个包的子文件夹。我们经常将包组织在作为其他包的子文件夹的文件夹中,因为这些包之间存在某种连接(例如,一个包仅由父文件夹中的另一个使用;或者子文件夹中的包是父文件夹中包的特定或更特殊的实现;或者只是一个逻辑分组-请参阅答案的结尾)

所以无论你什么时候

import "github.com/usera/pkgfoo"
它只导入
pkgfoo
,没有与prefix共享相同路径的其他包。如果您也需要
github.com/usera/pkgfoo/subpkg
,您还需要显式导入它:

import (
    "github.com/usera/pkgfoo"
    "github.com/usera/pkgfoo/subpkg"
}

在标准库中使用的目录上:

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


Go包由一个或多个源文件构成,这些源文件被组织到文件系统中的文件夹中。同一包的源文件必须位于同一文件夹中

但在Go中没有“包层次结构”,术语“子包”只是指一个包的文件夹是另一个包的子文件夹。我们通常将包组织在文件夹中,作为其他包的子文件夹,因为这些包之间存在某种连接(例如,一个包仅由父文件夹中的另一个使用;或者子文件夹中的包是父文件夹中包的特定或更特殊的实现;或者只是一个逻辑分组-请参阅答案的结尾)

所以无论你什么时候

import "github.com/usera/pkgfoo"
它只导入
pkgfoo
,没有与prefix共享相同路径的其他包。如果您也需要
github.com/usera/pkgfoo/subpkg
,您还需要显式导入它:

import (
    "github.com/usera/pkgfoo"
    "github.com/usera/pkgfoo/subpkg"
}

在标准库中使用的目录上:

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


如果你想使用一个包,你只需要导入它。如果你不想使用它(直接或通过它的init副作用):不要导入它。没有“子包”在Go中。测试您的问题的最简单方法是删除导入并查看程序是否编译。如果不需要,则您需要它。如果您想使用它,则只需要导入一个包。如果您不想使用它(直接或通过其init副作用):不要导入它。没有“子包”测试你的问题最简单的方法是删除导入,看看程序是否编译。如果不是,你需要它。