golang导入本地自定义的包的方法与local import “./XXX“ in non-local package错误详解

本文详细介绍了在Go语言中如何导入不同类型的包,包括标准库中的包、网络上的第三方包及本地自定义的包,并提供了具体的操作步骤和实例。


在编写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”
      
    2. 在源文件中导入包:
      import "packagename"
      
    下面的图片中的例子更加直观:
    例二
    这样,就完成了对自定义的本地包的导入。
github.com/golangci/golangci-lint/cmd/golangci-lint imports cmp: package cmp is not in GOROOT (/usr/local/go/src/cmp) github.com/golangci/golangci-lint/cmd/golangci-lint imports github.com/golangci/golangci-lint/pkg/commands imports maps: package maps is not in GOROOT (/usr/local/go/src/maps) github.com/golangci/golangci-lint/cmd/golangci-lint imports github.com/golangci/golangci-lint/pkg/commands imports slices: package slices is not in GOROOT (/usr/local/go/src/slices) github.com/golangci/golangci-lint/cmd/golangci-lint imports github.com/golangci/golangci-lint/pkg/commands imports github.com/golangci/golangci-lint/pkg/goutil imports go/version: package go/version is not in GOROOT (/usr/local/go/src/go/version) github.com/golangci/golangci-lint/cmd/golangci-lint imports github.com/golangci/golangci-lint/pkg/commands imports github.com/spf13/viper imports log/slog: package log/slog is not in GOROOT (/usr/local/go/src/log/slog) github.com/golangci/golangci-lint/cmd/golangci-lint imports github.com/golangci/golangci-lint/pkg/commands imports github.com/golangci/golangci-lint/pkg/lint/lintersdb imports github.com/golangci/golangci-lint/pkg/golinters/sloglint imports go-simpler.org/sloglint imports iter: package iter is not in GOROOT (/usr/local/go/src/iter) github.com/golangci/golangci-lint/cmd/golangci-lint imports github.com/golangci/golangci-lint/pkg/commands imports net/http imports crypto/tls imports golang.org/x/crypto/curve25519 imports crypto/ecdh: package crypto/ecdh is not in GOROOT (/usr/local/go/src/crypto/ecdh)
最新发布
05-28
<think>嗯,用户遇到了Go模块中因GOROOT路径导致的导入错误问题,具体是关于golangci-lint的导入。我需要先理解这个错误的原因。根据经验,“package isnot inGOROOT”通常是因为Go编译器在GOROOT和GOPATH中找不到所需的。这可能发生在使用Go模块时,尤其是当依赖没有正确下载或模块路径配置有问题的时候。首先,用户可能没有正确初始化Go模块。使用gomod init命令创建模块是基础步骤,这样Go才能管理依赖。然后,需要确保依赖被正确下载,执行go modtidy可以清理和下载所需的依赖。如果问题仍然存在,可能需要检查GOPATH的设置。虽然Go模块不再强制依赖GOPATH,但某些工具可能还会参考它,所以确保GOPATH环境变量正确,并且项目不在GOPATH/src下,避免旧版GOPATH模式的干扰。另外,golangci-lint的安装方式也可能影响。用户可能通过管理器安装了旧版本,导致新模块不兼容。建议使用官方推荐的安装方法,比如用curl脚本安装到正确的路径,或者通过go install安装最新版本。同时,检查golangci-lint的版本是否过旧,升级到最新版可能解决兼容性问题。 还有,项目结构是否正确?比如go.mod文件的位置,模块名的声明是否正确,这些都会影响导入路径。如果模块声明为example.com/mymodule,那么导入应该使用这个路径,而不是相对路径或GOPATH下的路径。此外,环境变量如GO111MODULE是否设置为on,确保启用了模块支持。 最后,可能需要清理构建缓存,运行go clean-modcache清除旧的依赖缓存,然后重新下载。如果问题依旧,查看具体的导入语句是否有误,或者是否存在循环依赖等问题。综合这些步骤,应该能逐步定位并解决这个错误。</think>### 解决Go模块中"package is not in GOROOT"错误的步骤 #### 1. 确认模块初始化 首先确保项目已正确初始化Go模块: ```bash $ go mod init <module-name> # 如: go mod init example.com/mymodule $ go mod tidy # 自动下载依赖[^4] ``` 这会在项目根目录生成`go.mod`文件,建立模块依赖关系树[^2] #### 2. 检查环境变量配置 ```bash $ go env -w GO111MODULE=on # 强制启用模块模式 $ go env GOPATH # 确认GOPATH路径不含当前项目 ``` 若项目路径在`$GOPATH/src`下,建议移出该目录以避免旧版GOPATH模式干扰[^1] #### 3. 清理并重建依赖 ```bash $ go clean -modcache # 清除旧依赖缓存 $ go mod download # 重新下载所有依赖 ``` 该操作会强制刷新`$GOPATH/pkg/mod`中的依赖[^2] #### 4. 升级golangci-lint 使用官方推荐方式安装最新版本: ```bash $ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.52.2 ``` 验证安装路径是否在系统PATH中: ```bash $ which golangci-lint # 应输出类似$GOPATH/bin/golangci-lint ``` #### 5. 配置IDE集成(以VS Code为例) 在`.vscode/settings.json`中添加: ```json { "go.toolsEnvVars": { "GOFLAGS": "-mod=mod" # 强制使用模块模式 } } ``` #### 6. 典型错误场景处理 当出现类似错误时: ``` package example.com/mymodule/mypkg: unrecognized import path "example.com/mymodule/mypkg": reading https://example.com/mymodule/mypkg?go-get=1: 404 Not Found ``` 需在`go.mod`中通过`replace`指令修正路径: ```go module example.com/mymodule replace example.com/mymodule/mypkg => ./mypkg # 指向本地相对路径 ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值