Go import 报错分析及解决方法 could not import 与 项目文件管理 - Go语言中文社区

Go import 报错分析及解决方法 could not import 与 项目文件管理


Go Import 与 项目文件管理
整理关于 import 报错的分析及解决方法,希望通过此文可解决97%的import问题,3%可能与IDE有关。

本文讨论两种项目文件管理方式:GOPATH 和 GOMOD:
在VSCode中比较发现两者各有优点:

  1. GOPATH方式下,VSCode可直接指定打开GOPATH路径的文件夹,然后查看内部的src文件夹下的多个不同项目文件夹,方便不同项目文件夹下执行调试。
  2. GOMODULE方式下,可以指定任意文件夹为项目文件夹,VSCode每次只能打开一个项目文件夹,并且建议在此文件夹下创建.vscode文件夹,其中包含launch.json和settings.json文件。

一、GOPATH下项目文件管理:

1 import 过程理解:

首先明确 GOROOT 和 GOPATH 绝对路径,通过命令行go env即可查看。
包依赖引用的寻找过程:举例*.go文件中 import "custompkg"会查找如下路径:

  1. <GOROOT>/src/custompkg 表示from $GOROOT;
  2. <GOPATH>/src/custompkg 表示from $GOPATH;
  3. <GOPATH>/src/<projectName>/vendor/custompkg 表示 vendor tree,如果没有用GOVENDER,参考GOMOD;
  4. <GOPATH>/src/<projectName>/src/custompkg 表示from $GOPATH;

可见对于自定义的GOPATH中,我们需要创建一个src文件夹(其实应该同时创建3个文件夹bin, pkg, src),然后在src中创建不同project的文件夹,每个project中再创建3个文件夹(bin,pkg,src)。

对于自定义的包文件夹通常创建在<GOPATH>/src/<projectName>/src文件夹中,例如:
VSCode示例图1
图1中,util为自定义包文件夹,其中包含多个*.go文件,每个*.go文件包含不同功能函数,当main.go中调用自定义包中不同*.go文件中的这些函数时,只要在main.go中import包路径即可:

import (
	"fmt"
	util "project1/src/util"
)

注释:

  1. "project1/src/util"的位置在<GOPATH>src文件夹中。

  2. 最开头的util是别名alias,可自定义,调用时写<alias>.函数名(),对于自定义的包强烈推荐加别名,且建议和包名相同。
    如果不加别名,有如下要求:
    2.1 自定义的包文件夹命名中不能包含特殊字符例如_, -, +等;
    2.2 包文件夹中所有*.go文件首行package名就是调用方法的类名。
    示例图2

  3. 在同一包文件夹下的不同*.go文件中第一行的 package <包名> 必须相同,强烈建议和包文件夹名相同。

  4. import包文件夹名,就会import此包文件夹下的所有*.go文件,即包文件夹中的所有函数都可用。

  5. 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$GOPATHsrcUsers<userName>gosrc中存在指定的文件夹,但是仍然报无法找到包的错误。
在这里插入图片描述Cause: 查看发现自定义包文件夹下每个*.go文件首行的package <包名>有不一样的。

Solution: 同一包文件夹下不同*.go文件中package包名要求相同。
例如VS Code中,重新打开此项目文件夹即可,或者修改一下package名为任何未使用过的名,再改回来,报错即消失。
类似的报错,会因为修改package的先后顺序而出现Symptom中的错误,此时建议确保package后的命名和import文件夹相同即可,但不强制要求。
图4
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 文件。

  1. 在 VSCode 中可能出现下图报错:
    在util.go首行出现此提示
    解决方法:
    在setting.json中添加:“go.useLanguageServer”: true
    在这里插入图片描述

  2. 在 VSCode 中可能出现下图报错:
    在这里插入图片描述
    解决方法:
    确保VS Code 打开的folder是project1GoBasic,因为VS Code每次只能打开一个Project,并且在GO111MODULE=on时,每个Project文件夹中必须有个go.mod。
    详情参考:https://github.com/golang/tools/blob/master/gopls/doc/workspace.md
    在这里插入图片描述

以上内容来自个人总结自测,如有误导欢迎各位大神留言更正。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zkyapple/article/details/112108283
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-16 15:59:28
  • 阅读 ( 1680 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢