Golang Go语言中如何在新版本中import旧版本的标准库?

Golang Go语言中如何在新版本中import旧版本的标准库?

方法最好是通用的,不是指某一个 pkg ;

RT,非常感谢!

19 回复

降低版本?

更多关于Golang Go语言中如何在新版本中import旧版本的标准库?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


标准库不是向下兼容的吗?

1.x 的标准库是向下兼容的?

试下这个格式 go get golang.org/x/net v0.0.0-20200116001909-b77594299b42

根据最小版本原则,同一个依赖会引用最高版本,要降所有依赖的一起降

目前遇到的问题是 go/ast 这个库 在 go1.15 有问题,调试也没发现问题,只能想到这个办法

目前遇到的问题是 go/ast 这个库 在 go1.15 有问题,调试也没发现问题,只能想到这个办法

go/ast 在 x 下面没有的,只有 golang.org/x/tools/go/ast/astutil,这个是 util 来的,也是引用标准库的 ast

标准库默认的是链接$GOROOT/pkg/$GOOS_$GOARCH 下的目标文件,
比如"import go/ast“的话会链接 /usr/local/go/pkg/linux_amd64/go/ast.a,
目前没看到链接器有提供选项可以改这个。按我的愚见有两种思路:
1. git clone 指定版本的 go 源码到 GOPATH/pkg/mod/github.com/golang
比如 git clone --branch go1.13.1 https://github.com/golang/go %GOPATH%/pkg/mod/github.com/golang
这样可以 import "github.com/golang/go/src/go/ast"来使用
2. 在当前项目下用 vendor 管理一个标准库的副本

那就只能 vender 了

啥问题,提 issue 了吗

不要搞黑科技,如果真的有必要就老老实实拷出来当作一个第三方包来维护。

自己 fork 一个再引用

每一个难以理解的问题,细究下来都是典型的 xy 问题

https://www.jianshu.com/p/bbe05166aa7d

直接问你发现的 ast 标准库的问题不是更好吗?

当然明白你的意思,但查清 /复现具体的问题对我来说目前要花不少时间,我只能基于经验判断并得出一个目前较快解决问题的方案,至于具体的问题,是否真的是标准库 bug 要等到自己有时间才能去查明。

对编译器做 git bisect,看看是哪一个 commit 导致的,然后要么改自己代码,要么去 github 提 issue

标准库 ast 包很少改动,数到第十个 commit 都已经是一年半以前了。而且大多数是改注释

不要怀疑标准库,绝大部分情况下是你自己的问题

在Golang中,Go语言的模块系统和版本管理主要通过Go Modules来实现。通常情况下,Go的标准库(std lib)是随着Go语言版本的发布而更新的,且标准库并没有像第三方库那样的独立版本控制。因此,直接“import旧版本的标准库”在Go的官方工具链中并不被直接支持。

不过,如果你确实需要使用某个特定Go版本中的标准库行为(可能是为了兼容旧代码或解决新版本中的回归问题),你可以考虑以下几种方法:

  1. 使用特定版本的Go编译器:最简单直接的方法是使用包含你所需标准库版本的Go编译器来编译你的项目。你可以通过安装多个Go版本来实现这一点,使用go version命令来切换版本。

  2. 复制标准库代码:虽然不推荐,但理论上你可以将旧版本的标准库代码复制到你的项目中,并适当调整包路径以避免冲突。这种方法可能会引入维护负担和潜在的法律问题。

  3. 使用兼容性层:如果新旧版本的标准库差异不大,你可以考虑在项目中实现一个兼容性层,以适配新版本的行为。

  4. 依赖管理:对于第三方库,Go Modules允许你指定依赖的具体版本。但对于标准库,这一机制不适用。

总之,处理标准库版本问题通常涉及到使用特定版本的Go编译器,这是最直接且官方推荐的方法。

回到顶部