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

7 回复

Dean_Davidson:

你能否发布一份你的 go.mod 文件副本?

此外,还有你运行的命令以及它们返回的错误信息。

可能还有你使用的导入语句。

细节越多越好。

更多关于Golang开发中遇到的痛点与不满的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


嗯。或许你可以贴一下你的 go.mod 文件?你具体是尝试导入哪个包但无法成功?你读过这篇文章吗?

图片

使用 Go 模块 - Go 编程语言

一篇关于开始使用 Go 模块所需基本操作的介绍。

我正在使用的Go语言学习指南总是将“模块名”用作项目的目录名称。这是必需的吗?当我运行“go mod help init”时,输出的第一行写着“用法:go mod init [模块路径]”。我想确认这个“模块路径”是否完全独立于包含项目代码的文件路径。帮助输出还说模块路径是可选的,会从内容中推断;但如果还没有任何内容,会发生什么?

要将项目初始化为 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模块工作原理的误解。

核心问题分析:

  1. go get 与模块感知模式:在模块化项目中(有 go.mod 文件),go get 主要用于修改依赖版本,而不是“安装”包到系统目录。依赖包会被下载到模块缓存($GOPATH/pkg/mod),而不是 /usr/local/go 或项目目录。

  2. 导入路径解析:Go 导入的是模块路径(在 go.mod 中定义),而不是文件系统路径。这就是为什么相对路径导入不被支持——它确保了代码的可移植性和明确的依赖关系。

解决方案示例:

假设你的项目结构如下:

/myproject
  ├── go.mod
  ├── main.go
  └── /internal
      └── /mypkg
          └── utils.go

正确的本地导入方式:

  1. 初始化模块(如果还没做):
cd /myproject
go mod init github.com/yourname/myproject
  1. 导入内部包(在 main.go 中):
package main

import (
    "fmt"
    "github.com/yourname/myproject/internal/mypkg"
)

func main() {
    fmt.Println(mypkg.SomeFunction())
}
  1. 处理外部依赖
# 这会更新 go.mod 和 go.sum
go get github.com/gin-gonic/gin@v1.9.0

然后直接导入:

import "github.com/gin-gonic/gin"

关键检查点:

  1. 确保在项目根目录执行命令
  2. 检查 go.mod 文件中的模块名称
  3. 验证 go env GOPROXY 设置(国内常用 GOPROXY=https://goproxy.cn,direct
  4. 使用 go list -m all 查看所有依赖

常见错误处理:

# 清理并重新同步依赖
rm -rf go.sum
go mod tidy

# 查看可用的包版本
go list -m -versions github.com/some/package

# 下载所有依赖到缓存
go mod download

Go 的模块设计强调可重复构建和明确的依赖声明。虽然初期需要适应,但一旦理解其规则,依赖管理会变得非常可靠。模块系统将依赖关系显式化,避免了其他语言中常见的“在我机器上能运行”的问题。

回到顶部