/src/custompkg 表示from $GOROOT; 赞 踩 Go Import 与 项目文件管理 本文讨论两种项目文件管理方式:GOPATH 和 GOMOD: 一、GOPATH下项目文件管理: 1 import 过程理解: 首先明确 GOROOT 和 GOPATH 绝对路径,通过命令行 可见对于自定义的GOPATH中,我们需要创建一个src文件夹(其实应该同时创建3个文件夹bin, pkg, src),然后在src中创建不同project的文件夹,每个project中再创建3个文件夹(bin,pkg,src)。 对于自定义的包文件夹通常创建在 注释: "project1/src/util"的位置在 最开头的util是别名alias,可自定义,调用时写 在同一包文件夹下的不同*.go文件中第一行的 package <包名> 必须相同,强烈建议和包文件夹名相同。 import包文件夹名,就会import此包文件夹下的所有*.go文件,即包文件夹中的所有函数都可用。 import 只能包文件夹,不能以 总结自定义包建议: 1 自定义包文件夹下的不同*.go文件中首行的package <包名>必须相同,强烈建议和自定义包文件夹名相同; import Error 案例: Symptom: Solution: 同一包文件夹下不同*.go文件中package包名要求相同。 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。 可以先指定GOPATH,例如:go env -w GOPATH=C:\Code\Golang,(这步可以忽略,因为GOMOD可以指定任意路径为项目路径) 举例: 在 VSCode 中可能出现下图报错: 在 VSCode 中可能出现下图报错: 以上内容来自个人总结自测,如有误导欢迎各位大神留言更正。 Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。
Go import 报错分析及解决方法 could not import 与 项目文件管理
整理关于 import 报错的分析及解决方法,希望通过此文可解决97%的import问题,3%可能与IDE有关。
在VSCode中比较发现两者各有优点:
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/<projectName>/src
文件夹中,例如:
图1中,util为自定义包文件夹,其中包含多个*.go文件,每个*.go文件包含不同功能函数,当main.go中调用自定义包中不同*.go文件中的这些函数时,只要在main.go中import包路径即可:import (
"fmt"
util "project1/src/util"
)
<GOPATH>\src\
文件夹中。<alias>.函数名()
,对于自定义的包强烈推荐加别名,且建议和包名相同。
如果不加别名,有如下要求:
2.1 自定义的包文件夹命名中不能包含特殊字符例如_, -, +等;
2.2 包文件夹中所有*.go文件首行package名就是调用方法的类名。
/
结尾,也不能是具体的*.go文件。
2 import含路径的包名强烈建议加别名,调用方法时用别名调用;
3 自定义包文件夹命名不建议包含特殊字符。
could not import errors (cannot find package "errors" in any of c:\go\src\errors (from $GOROOT)...)
在VS Code中,import 标准库出现如上报错,或已经确认在$GOROOT\src
和$GOPATH\src
和\Users\<userName>\go\src
中存在指定的文件夹,但是仍然报无法找到包的错误。
Cause: 查看发现自定义包文件夹下每个*.go文件首行的package <包名>有不一样的。
例如VS Code中,重新打开此项目文件夹即可,或者修改一下package名为任何未使用过的名,再改回来,报错即消失。
类似的报错,会因为修改package的先后顺序而出现Symptom中的错误,此时建议确保package后的命名和import文件夹相同即可,但不强制要求。
Symptom: could not import <...>(cannot find package "<...>" in any of c:\go\src\errors (from $GOROOT)...)
,即使已经设置了GOPATH为系统环境变量,但是VSCode中缺未生效。
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文件的目录下面。
创建一个文件夹如: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 文件。
解决方法:
在setting.json中添加:“go.useLanguageServer”: true
解决方法:
确保VS Code 打开的folder是project1GoBasic,因为VS Code每次只能打开一个Project,并且在GO111MODULE=on时,每个Project文件夹中必须有个go.mod。
详情参考:https://github.com/golang/tools/blob/master/gopls/doc/workspace.md