社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
Go Import 与 项目文件管理
整理关于 import 报错的分析及解决方法,希望通过此文可解决97%的import问题,3%可能与IDE有关。
本文讨论两种项目文件管理方式:GOPATH 和 GOMOD:
在VSCode中比较发现两者各有优点:
- GOPATH方式下,VSCode可直接指定打开GOPATH路径的文件夹,然后查看内部的src文件夹下的多个不同项目文件夹,方便不同项目文件夹下执行调试。
- GOMODULE方式下,可以指定任意文件夹为项目文件夹,VSCode每次只能打开一个项目文件夹,并且建议在此文件夹下创建.vscode文件夹,其中包含launch.json和settings.json文件。
一、GOPATH下项目文件管理:
1 import 过程理解:
首先明确 GOROOT 和 GOPATH 绝对路径,通过命令行go env
即可查看。
包依赖引用的寻找过程:举例*.go文件中 import "custompkg"
会查找如下路径:
<GOROOT>/src/custompkg
表示from $GOROOT;<GOPATH>/src/custompkg
表示from $GOPATH;<GOPATH>/src/<projectName>/vendor/custompkg
表示 vendor tree,如果没有用GOVENDER,参考GOMOD;<GOPATH>/src/<projectName>/src/custompkg
表示from $GOPATH;可见对于自定义的GOPATH中,我们需要创建一个src文件夹(其实应该同时创建3个文件夹bin, pkg, src),然后在src中创建不同project的文件夹,每个project中再创建3个文件夹(bin,pkg,src)。
对于自定义的包文件夹通常创建在<GOPATH>/src/<projectName>/src
文件夹中,例如:
图1中,util为自定义包文件夹,其中包含多个*.go文件,每个*.go文件包含不同功能函数,当main.go中调用自定义包中不同*.go文件中的这些函数时,只要在main.go中import包路径即可:
import (
"fmt"
util "project1/src/util"
)
注释:
"project1/src/util"的位置在<GOPATH>src
文件夹中。
最开头的util是别名alias,可自定义,调用时写<alias>.函数名()
,对于自定义的包强烈推荐加别名,且建议和包名相同。
如果不加别名,有如下要求:
2.1 自定义的包文件夹命名中不能包含特殊字符例如_, -, +等;
2.2 包文件夹中所有*.go文件首行package名就是调用方法的类名。
在同一包文件夹下的不同*.go文件中第一行的 package <包名> 必须相同,强烈建议和包文件夹名相同。
import包文件夹名,就会import此包文件夹下的所有*.go文件,即包文件夹中的所有函数都可用。
import 只能包文件夹,不能以/
结尾,也不能是具体的*.go文件。
总结自定义包建议:
1 自定义包文件夹下的不同*.go文件中首行的package <包名>必须相同,强烈建议和自定义包文件夹名相同;
2 import含路径的包名强烈建议加别名,调用方法时用别名调用;
3 自定义包文件夹命名不建议包含特殊字符。
import Error 案例:
Symptom: could not import errors (cannot find package "errors" in any of c:gosrcerrors (from $GOROOT)...)
在VS Code中,import 标准库出现如上报错,或已经确认在$GOROOTsrc
和$GOPATHsrc
和Users<userName>gosrc
中存在指定的文件夹,但是仍然报无法找到包的错误。
Cause: 查看发现自定义包文件夹下每个*.go文件首行的package <包名>有不一样的。
Solution: 同一包文件夹下不同*.go文件中package包名要求相同。
例如VS Code中,重新打开此项目文件夹即可,或者修改一下package名为任何未使用过的名,再改回来,报错即消失。
类似的报错,会因为修改package的先后顺序而出现Symptom中的错误,此时建议确保package后的命名和import文件夹相同即可,但不强制要求。
Symptom: could not import <...>(cannot find package "<...>" in any of c:gosrcerrors (from $GOROOT)...)
,即使已经设置了GOPATH为系统环境变量,但是VSCode中缺未生效。
Cause: 查看发现VSCode中,存在独立设置在settings.json 有 “go.gopath”: “C:users…Go”,
Solution: 快捷键Ctrl+逗号,搜索gopath,修改settings.json中的 "go.gopath"为期望路径。
二、GOMOD 下项目文件管理:
Go 1.11以后的版本支持Go Modules。
首先,在Win10中执行:go env -w GO111MODULE=on 可以先指定GO111MODULE=on。
GO111MODULE有三个值:off, on和auto(默认值)。
GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
当前目录在GOPATH/src之外且该目录包含go.mod文件
当前文件在包含go.mod文件的目录下面。
可以先指定GOPATH,例如:go env -w GOPATH=C:CodeGolang,(这步可以忽略,因为GOMOD可以指定任意路径为项目路径)
举例:
创建一个文件夹如:project1GoBasic,然后在CMD中cd到此文件夹,执行:go mod init project1GoBasic
会在project1GoBasic文件夹生成go.mod文件,然后可以创建util文件夹,其中即可存放各种 *.go 文件:
(1) 各 *.go 文件中可定义各种方法或函数供外部调用。
(2) 各 *.go 文件中首行是 package project1GoBasic。
(3) 在 main.go 中 import 部分即可添加:util “project1GoBasic/util”,此时代表import util文件夹中所有 *.go 文件。
在 VSCode 中可能出现下图报错:
解决方法:
在setting.json中添加:“go.useLanguageServer”: true
在 VSCode 中可能出现下图报错:
解决方法:
确保VS Code 打开的folder是project1GoBasic,因为VS Code每次只能打开一个Project,并且在GO111MODULE=on时,每个Project文件夹中必须有个go.mod。
详情参考:https://github.com/golang/tools/blob/master/gopls/doc/workspace.md
以上内容来自个人总结自测,如有误导欢迎各位大神留言更正。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!