Golang 中有两部分的包搜索路径由两部分主成:
基础的搜索路径首先都包括 $GOROOT/src
。在此基础上,按照 GO111MODULE
的设置不同还会增加不同的路径。
GO111MODULE=off
使用传统的gopath
模式,包基础搜索路径包含$GOPATH/src/
。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 惯例是和路径名保持一致。