文章目录

  • 情况一:导入的包为标准库中的包
  • 情况二:导入的包为网络上的第三方包
  • 情况三:导入的包为本地自定义的包



在编写go程序时,如果在导入包的时候想导入本地或相对路径下自定义的包,如果使用直接使用

import "./mypackage"这种格式往往就会出现以下报错:

local import "./XXX" in non-local package

在查询资料发现有人说以前的版本这样是可以的,不过反正现在(我的go版本为1.18.3)是不行的。解决的方法也很简单,只要按照一定的格式导入包就可以了,尽管是比较基础的内容,但对于像我一样的初学者,难免有疑惑,下面具体分析。


情况一:导入的包为标准库中的包

当导入的包为fmt或者os这类包含在标准库中的包时,可以直接通过以下方式导入:

//import "包名" ,例如:
import "fmt"

情况二:导入的包为网络上的第三方包

当导入的包既不是标准包,也不是在本地自定义的包时,可以通过与情况一相似的格式直接调用。如这个教程中所示:
go语言之旅 上面的例子需要设置好环境变量GOPROXY的值为https://goproxy.cn,不然在国内可能由于网络问题而出现错误。
因此,这种情况下,导入包的格式与情况一相同:

//import "网址/包名”,例如:
import "golang.org/x/tour/pic"

情况三:导入的包为本地自定义的包

当导入的包属于本地自定义的包时,也分为两种情况进行说明:

  • 导入的包位于同一module下时:
    当需要导入包的源文件与该包属于同一个module(module的概念可以看我的前一篇博客,需要理解go mod的用法)时,可以通过import "模块名/包名"的方式导入:
//import "模块名/包名",例如:
import "moduleName/packageName"
  • 下面的图片举例更加直观:
  • 导入的包位于不同的module下时:
    当需要导入包的源文件与该包属于不同的module时,按照上面的方法就无法定位到正确的位置了,究其原因,是因为要导入一个包,就需要知道它所在的位置,对于本地自定义的包来说,也就是需要知道存放包的路径。现在的go版本不再支持在源文件中直接通过import相对路径的方法查找包了,因此就需要通过其它方式确定包所在的位置,而这种方法就是通过配置go.mod实现的。
    go.mod文件正是对某个module需要的依赖包进行管理的文件,里面配置的详细方法可以参照我的上一篇博客。这里给出具体的解决方式:
  1. 修改go.mod文件,添加以下内容:
require packagename v0.0.0 //packagename为包的名称
replace packagename => dir //dir修改为包所在的相对路径。如:“../dir”
  1. 在源文件中导入包:
import "packagename"
  1. 下面的图片中的例子更加直观:

    这样,就完成了对自定义的本地包的导入。