Golang开发中遇到的痛点与不满
Golang开发中遇到的痛点与不满 我想大致写一下我最初几次尝试使用Go语言的经历。
从未,从未在任何其他语言中,仅仅导入依赖项就遇到过如此多的问题。
无论我尝试了什么方法,删除go.sum并运行go mod tidy,将项目目录移动到不同的位置,我都不明白问题出在哪里。
我使用go get来获取包,它显示包已安装,但当我尝试将其添加到导入语句时,却怎么也找不到它。我明明在/usr/local/go目录下看到了它,但我的项目就是找不到。本地导入的情况更糟,因为它必须位于GOPATH或GOROOT中。为什么要强迫我这样做,而不是让我使用相对路径来导航到我想要导入的包。
如果不是因为我正在进行的项目绝对需要使用Go,我早就放弃并转向其他语言了。
导入是最基本的事情,但不知为何,Go语言却决定将其设计得异常复杂,并且在这种语言中很容易出错。
关于这一点,是否有一些没有充分记录的基本指导原则?
更多关于Golang开发中遇到的痛点与不满的实战教程也可以访问 https://www.itying.com/category-94-b0.html
Dean_Davidson:
你能否发布一份你的
go.mod文件副本?
此外,还有你运行的命令以及它们返回的错误信息。
可能还有你使用的导入语句。
细节越多越好。
更多关于Golang开发中遇到的痛点与不满的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
要将项目初始化为 Go 模块,请使用命令行导航到项目的根目录,然后运行 go mod init <模块名称>。将 <模块名称> 替换为你想要的模块名称。此命令会创建一个 go.mod 文件,该文件作为依赖项的清单。需要注意的是,模块名称应该是一个有效的模块路径(例如,一个URL或版本控制系统上的路径)。将项目初始化为 Go 模块可以确保依赖项得到正确管理。谢谢。
我搞明白了。
我的一些开发工作是通过SSH进行的,并且通过sshfs挂载远程系统。这导致的问题是,因为IDE无法看到已安装的包,因为它们不在IDE运行的同一系统上。代码可以运行,但IDE中的错误不会消失,所以这只是IDE中Go插件的一个误报。
我以前用这个设置从未遇到过这个问题,因为我用过的其他语言都是直接将依赖安装在工作目录中。
请随意删除这个帖子。我对它给人的感觉(真的很爱发牢骚)并不太满意。当时又累又沮丧,让情绪影响了自己。我本该起身去散个步,而不是发这个帖子。
尽管我尽了最大努力,但在为我的项目导入依赖时还是遇到了障碍。无论我尝试什么方法——无论是删除 go.sum 文件并运行 go mod tidy,还是重新定位我的项目目录——似乎都无法解决问题。
我尝试使用 go get 命令来安装所需的包,该命令看似成功执行且没有报错。但当我试图将其导入我的项目时,却出现了一个令人沮丧的障碍。尽管该包物理上位于 /usr/local/go 目录中,却根本无法被找到。处理本地导入时情况变得更糟,因为它们要求必须放置在 GOPATH 或 GOROOT 内。
Go的模块系统确实有一个学习曲线,特别是对于从其他语言转来的开发者。你遇到的问题很常见,主要源于对Go模块工作原理的误解。
核心问题分析:
-
go get与模块感知模式:在模块化项目中(有go.mod文件),go get主要用于修改依赖版本,而不是“安装”包到系统目录。依赖包会被下载到模块缓存($GOPATH/pkg/mod),而不是/usr/local/go或项目目录。 -
导入路径解析:Go 导入的是模块路径(在
go.mod中定义),而不是文件系统路径。这就是为什么相对路径导入不被支持——它确保了代码的可移植性和明确的依赖关系。
解决方案示例:
假设你的项目结构如下:
/myproject
├── go.mod
├── main.go
└── /internal
└── /mypkg
└── utils.go
正确的本地导入方式:
- 初始化模块(如果还没做):
cd /myproject
go mod init github.com/yourname/myproject
- 导入内部包(在
main.go中):
package main
import (
"fmt"
"github.com/yourname/myproject/internal/mypkg"
)
func main() {
fmt.Println(mypkg.SomeFunction())
}
- 处理外部依赖:
# 这会更新 go.mod 和 go.sum
go get github.com/gin-gonic/gin@v1.9.0
然后直接导入:
import "github.com/gin-gonic/gin"
关键检查点:
- 确保在项目根目录执行命令
- 检查
go.mod文件中的模块名称 - 验证
go env GOPROXY设置(国内常用GOPROXY=https://goproxy.cn,direct) - 使用
go list -m all查看所有依赖
常见错误处理:
# 清理并重新同步依赖
rm -rf go.sum
go mod tidy
# 查看可用的包版本
go list -m -versions github.com/some/package
# 下载所有依赖到缓存
go mod download
Go 的模块设计强调可重复构建和明确的依赖声明。虽然初期需要适应,但一旦理解其规则,依赖管理会变得非常可靠。模块系统将依赖关系显式化,避免了其他语言中常见的“在我机器上能运行”的问题。



