Golang 中有两部分的包搜索路径由两部分主成:

基础的搜索路径首先都包括 $GOROOT/src。在此基础上,按照 GO111MODULE 的设置不同还会增加不同的路径。

  1. GO111MODULE=off 使用传统的 gopath 模式,包基础搜索路径包含 $GOPATH/src/
  2. GO111MODULE=on 使用 gomod 模式,包基础搜索路径包含 $GOPATH/pkg/mod/

包导入路径就是每个源文件头部包导入部分的路径。基础路径组合包导入路径,就构成了源文件所有依赖包的源码搜索路径。以下面的例子为例:

package p1
 
import (
    "fmt"
    "time"
    "github.com/bigwhite/effective-go-book"
    "golang.org/x/text"
    "a/b/c"
    "./e/f/g"
)

该源码包的搜索路径集合在使用 gomod 模式时可以展开为下面这样:

- $GOROOT/src/fmt/
- $GOROOT/src/time/
- $GOROOT/src/github.com/bigwhite/effective-go-book/
- $GOROOT/src/golang.org/x/text/
- $GOROOT/src/a/b/c/
- $GOPATH/pkg/mod/github.com/bigwhite/effective-go-book/
- $GOPATH/pkg/mod/golang.org/x/text/
- $GOPATH/pkg/mod/a/b/c/
- $CWD/e/f/g

这里也可以看出代码中 import 中的其实是路径名,而不是包名,包名由路径中源文件头部的 package 关键字指定,其可能和路径名不同,只是 Golang 惯例是和路径名保持一致。