几种Go版本管理工具

这篇具有很好参考价值的文章主要介绍了几种Go版本管理工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

缘起:


编译下面这段代码时,在Mac上没有什么问题,正常运行,

点击查看代码:
package main

import (
 "bytes"
 "encoding/binary"
 "encoding/json"
 "fmt"
 "log"
 "math/rand"
 "net/http"
 "time"
)

func main() {

 http.HandleFunc("/register", deal) //设置访问的路由

 fmt.Println("1111:"2222)

 err := http.ListenAndServe(":8088"nil//设置监听的端口
 if err != nil {
  log.Fatal("ListenAndServe: ", err)
 }

}

func deal(w http.ResponseWriter, r *http.Request) {

 // Golang: 接收GET和POST参数 https://www.cnblogs.com/liuhe688/p/11063945.html
 // 根据请求body创建一个json解析器实例
 decoder := json.NewDecoder(r.Body)
 // 用于存放参数key=value数据
 var params map[string]string

 // 解析参数 存入map
 decoder.Decode(&params)

 name := params["name"]

 rand.Seed(time.Now().UnixNano())

 key := crack(name)

 fmt.Println("name:", name, "    key:", crack(name))

 fmt.Fprintf(w, key) //这个写入到w的是输出到客户端的

}

const (
 rounds    = 12
 roundKeys = 2 * (rounds + 1)
)

func crack(text string) string {

 name := []byte(text)
 length := len(name) + 4
 padded := ((-length) & (8 - 1)) + length
 bs := make([]byte4)
 binary.BigEndian.PutUint32(bs, uint32(len(name)))
 buff := bytes.Buffer{}
 buff.Write(bs)
 buff.Write(name)

 var ckName int64 = 0x7a21c951691cd470
 var ckKey int64 = -5408575981733630035
 ck := newCkCipher(ckName)
 outBuff := bytes.Buffer{}

 for i := 0; i < padded; i += 8 {
  bf := buff.Bytes()[i : i+8]
  buf := bytes.NewBuffer(bf)
  var nowVar int64
  if err := binary.Read(buf, binary.BigEndian, &nowVar); err != nil {
   panic(err)
  }

  dd := ck.encrypt(nowVar)

  outBuff.WriteByte(byte(dd >> 56))
  outBuff.WriteByte(byte(dd >> 48))
  outBuff.WriteByte(byte(dd >> 40))
  outBuff.WriteByte(byte(dd >> 32))
  outBuff.WriteByte(byte(dd >> 24))
  outBuff.WriteByte(byte(dd >> 16))
  outBuff.WriteByte(byte(dd >> 8))
  outBuff.WriteByte(byte(dd))

 }
 var n int32
 for _, b := range outBuff.Bytes() {
  n = rotateLeft(n^int32(int8(b)), 0x3)
 }
 prefix := n ^ 0x54882f8a
 suffix := rand.Int31()
 in := int64(prefix) << 32
 s := int64(suffix)
 switch suffix >> 16 {
 case 0x0401:
 case 0x0402:
 case 0x0403:
  in |= s
  break
 default:
  in |= 0x01000000 | (s & 0xffffff)
  break
 }

 out := newCkCipher(ckKey).decrypt(in)

 var n2 int64
 for i := 56; i >= 0; i -= 8 {
  n2 ^= int64((uint64(in) >> i) & 0xff)
 }

 vv := int32(n2 & 0xff)
 if vv < 0 {
  vv = -vv
 }
 return fmt.Sprintf("%02x%016x", vv, uint64(out))
}

type ckCipher struct {
 rk [roundKeys]int32
}

func newCkCipher(ckKey int64) ckCipher {
 ck := ckCipher{}

 var ld [2]int32
 ld[0] = int32(ckKey)
 ld[1] = int32(uint64(ckKey) >> 32)

 ck.rk[0] = -1209970333
 for i := 1; i < roundKeys; i++ {
  ck.rk[i] = ck.rk[i-1] + -1640531527
 }
 var a, b int32
 var i, j int

 for k := 0; k < 3*roundKeys; k++ {
  ck.rk[i] = rotateLeft(ck.rk[i]+(a+b), 3)
  a = ck.rk[i]
  ld[j] = rotateLeft(ld[j]+(a+b), a+b)
  b = ld[j]
  i = (i + 1) % roundKeys
  j = (j + 1) % 2
 }
 return ck
}

func (ck ckCipher) encrypt(in int64) int64 {
 a := int32(in) + ck.rk[0]
 b := int32(uint64(in)>>32) + ck.rk[1]
 for r := 1; r <= rounds; r++ {
  a = rotateLeft(a^b, b) + ck.rk[2*r]
  b = rotateLeft(b^a, a) + ck.rk[2*r+1]
 }
 return pkLong(a, b)
}

func (ck ckCipher) decrypt(in int64) int64 {
 a := int32(in)
 b := int32(uint64(in) >> 32)
 for i := rounds; i > 0; i-- {
  b = rotateRight(b-ck.rk[2*i+1], a) ^ a
  a = rotateRight(a-ck.rk[2*i], b) ^ b
 }
 b -= ck.rk[1]
 a -= ck.rk[0]
 return pkLong(a, b)
}

func rotateLeft(x int32, y int32) int32 {
 return int32(x<<(y&(32-1))) | int32(uint32(x)>>(32-(y&(32-1))))
}

func rotateRight(x int32, y int32) int32 {
 return int32(uint32(x)>>(y&(32-1))) | int32(x<<(32-(y&(32-1))))
}

func pkLong(a int32, b int32) int64 {
 return (int64(a) & 0xffffffff) | (int64(b) << 32)
}

但到了Linux上,就会报错:

几种Go版本管理工具,后端
# command-line-arguments
./http_register.go:113:15: invalid operation: uint64(in) >> i (shift count type int, must be unsigned integer)
./http_register.go:175:16: invalid operation: x << (y & (32 - 1)) (shift count type int32, must be unsigned integer)
./http_register.go:175:47: invalid operation: uint32(x) >> (32 - y & (32 - 1)) (shift count type int32, must be unsigned integer)
./http_register.go:179:24: invalid operation: uint32(x) >> (y & (32 - 1)) (shift count type int32, must be unsigned integer)
./http_register.go:179:47: invalid operation: x << (32 - y & (32 - 1)) (shift count type int32, must be unsigned integer)

而在Mac上进行交叉编译[1]:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build 文件名.go

(如果出现GOROOT blabla之类的,执行go env -w GO111MODULE=off )

也没有什么问题

几种Go版本管理工具,后端

导致这种情况的原因,可能因Go版本不同而导致

几种Go版本管理工具,后端
几种Go版本管理工具,后端

Mac上的Go版本为 1.16, 而Linux上Go版本为 1.11




解决:


最初想看一下有没有在线的不同Go版本执行工具,无果而终.

想到之前用php时,用过brew switch来切换不同的php版本.但搜索之后发现,这个命令被 brew 弃用了.


之前用过node版本工具nvm,于是试图找寻Go有没有类似工具,发现了gvm.

安装gvm

$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

N.B. : 不同操作系统还需要安装所需依赖,如Mac需要执行brew install mercurial安装mercurial。具体见原始项目[2]

另外如果出现“ERROR: Unrecognized command line argument: 'use'”报错,可参考此文[3],执行:

cp -rp .gvm/scripts/env/use .gvm/scripts/use
chmod 775 .gvm/scripts/use

安装go 1.11

gvm install go1.11
几种Go版本管理工具,后端

选择版本

gvm use go1.11
几种Go版本管理工具,后端

果然已经变为 Go 1.11


在 Go 1.11 环境下执行,果然出现了和在Linux上Go 1.11下出现的同样错误

几种Go版本管理工具,后端



gvm更多命令


查看版本

➜ gvm list

gvm gos (installed)

=> go1.11
   system

查看Go的所有版本 (版本来源于源码中的 tag 标签)

点击查看Go所有版本:
 gvm listall

gvm gos (available)

   go1
   go1.0.1
   go1.0.2
   go1.0.3
   go1.1
   go1.1rc2
   go1.1rc3
   go1.1.1
   go1.1.2
   go1.2
   go1.2rc2
   go1.2rc3
   go1.2rc4
   go1.2rc5
   go1.2.1
   go1.2.2
   go1.3
   go1.3beta1
   go1.3beta2
   go1.3rc1
   go1.3rc2
   go1.3.1
   go1.3.2
   go1.3.3
   go1.4
   go1.4beta1
   go1.4rc1
   go1.4rc2
   go1.4.1
   go1.4.2
   go1.4.3
   go1.5
   go1.5beta1
   go1.5beta2
   go1.5beta3
   go1.5rc1
   go1.5.1
   go1.5.2
   go1.5.3
   go1.5.4
   go1.6
   go1.6beta1
   go1.6beta2
   go1.6rc1
   go1.6rc2
   go1.6.1
   go1.6.2
   go1.6.3
   go1.6.4
   go1.7
   go1.7beta1
   go1.7beta2
   go1.7rc1
   go1.7rc2
   go1.7rc3
   go1.7rc4
   go1.7rc5
   go1.7rc6
   go1.7.1
   go1.7.2
   go1.7.3
   go1.7.4
   go1.7.5
   go1.7.6
   go1.8
   go1.8beta1
   go1.8beta2
   go1.8rc1
   go1.8rc2
   go1.8rc3
   go1.8.1
   go1.8.2
   go1.8.3
   go1.8.4
   go1.8.5
   go1.8.5rc4
   go1.8.5rc5
   go1.8.6
   go1.8.7
   go1.9
   go1.9beta1
   go1.9beta2
   go1.9rc1
   go1.9rc2
   go1.9.1
   go1.9.2
   go1.9.3
   go1.9.4
   go1.9.5
   go1.9.6
   go1.9.7
   go1.10
   go1.10beta1
   go1.10beta2
   go1.10rc1
   go1.10rc2
   go1.10.1
   go1.10.2
   go1.10.3
   go1.10.4
   go1.10.5
   go1.10.6
   go1.10.7
   go1.10.8
   go1.11
   go1.11beta1
   go1.11beta2
   go1.11beta3
   go1.11rc1
   go1.11rc2
   go1.11.1
   go1.11.2
   go1.11.3
   go1.11.4
   go1.11.5
   go1.11.6
   go1.11.7
   go1.11.8
   go1.11.9
   go1.11.10
   go1.11.11
   go1.11.12
   go1.11.13
   go1.12
   go1.12beta1
   go1.12beta2
   go1.12rc1
   go1.12.1
   go1.12.2
   go1.12.3
   go1.12.4
   go1.12.5
   go1.12.6
   go1.12.7
   go1.12.8
   go1.12.9
   go1.12.10
   go1.12.11
   go1.12.12
   go1.12.13
   go1.12.14
   go1.12.15
   go1.12.16
   go1.12.17
   go1.13
   go1.13beta1
   go1.13rc1
   go1.13rc2
   go1.13.1
   go1.13.2
   go1.13.3
   go1.13.4
   go1.13.5
   go1.13.6
   go1.13.7
   go1.13.8
   go1.13.9
   go1.13.10
   go1.13.11
   go1.13.12
   go1.13.13
   go1.13.14
   go1.13.15
   go1.14
   go1.14beta1
   go1.14rc1
   go1.14.1
   go1.14.2
   go1.14.3
   go1.14.4
   go1.14.5
   go1.14.6
   go1.14.7
   go1.14.8
   go1.14.9
   go1.14.10
   go1.14.11
   go1.14.12
   go1.14.13
   go1.14.14
   go1.14.15
   go1.15
   go1.15beta1
   go1.15rc1
   go1.15rc2
   go1.15.1
   go1.15.2
   go1.15.3
   go1.15.4
   go1.15.5
   go1.15.6
   go1.15.7
   go1.15.8
   go1.15.9
   go1.15.10
   go1.15.11
   go1.15.12
   go1.16
   go1.16beta1
   go1.16rc1
   go1.16.1
   go1.16.2
   go1.16.3
   go1.16.4
   release.r56
   release.r57
   release.r58
   release.r59
   release.r60
   release.r57.1
   release.r57.2
   release.r58.1
   release.r58.2
   release.r60.1
   release.r60.2
   release.r60.3



其他方案--IDE


不管对于Python,还是Golang,面对版本问题时,使用PyCharm或GoLand,始终是极好的选择

但现在只能下载最近几个版本,更久远的无法安装

几种Go版本管理工具,后端
几种Go版本管理工具,后端



其他方案--Docker


docker pull golang:1.xx

docker run -it --name golang-1.xx自定义名称 golang:1.xx

进入到容器中(默认是基于ubuntu的镜像)

(如果没有vi/vim)切换源,安装vim

mv /etc/apt/sources.list /etc/apt/sources.list.bak

echo  "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free" >/etc/apt/sources.list

echo  "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free" >>/etc/apt/sources.list

echo  "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free" >>/etc/apt/sources.list

echo  "deb http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free" >>/etc/apt/sources.list

apt-get update

apt-get install -y vim

几种Go版本管理工具,后端

这种方式是万能的,任何版本都可以得到 (但是都是Linux版本的~)




其他方案--brew


但如果想用Mac的以往版本的Go,用Docker方式做不到~

还可以用brew

可以在这里[4]找到所有可以安装的Go版本

(从1.16开始支持m1)

几种Go版本管理工具,后端



问题解决


几种Go版本管理工具,后端

切换为Go 1.11.5版本后,IDE会自动报错


y为int32,将其强制转为uint32即可,

i为int,将其强制转为uint即可.

几种Go版本管理工具,后端


参考:

如何灵活地进行 Go 版本管理[5]




类似的工具还有g[6]

几种Go版本管理工具,后端

某位大佬推荐 gvc[7], 能管理很多种语言的版本

参考资料

[1]

交叉编译: https://studygolang.com/articles/14376

[2]

原始项目: https://github.com/moovweb/gvm#mac-os-x-requirements

[3]

此文: https://blog.csdn.net/qq_45534061/article/details/112256901

[4]

这里: https://formulae.brew.sh/formula/go#default

[5]

如何灵活地进行 Go 版本管理: https://juejin.cn/post/6844903949137346573

[6]

g: https://github.com/voidint/g

[7]

gvc: https://github.com/moqsien/gvc

本文由 mdnice 多平台发布文章来源地址https://www.toymoban.com/news/detail-693331.html

到了这里,关于几种Go版本管理工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go语言中的包管理工具之Go Modules的使用

    GoLang 中常用的包管理的方式 常用的有三种 Go Path Go Vendor Go Modules 关于 Go Modules 1 ) 概述 Go的包管理,经过社区和官方的共同努力下,最终在百家争鸣后 Go官方在 2018.8 推出了go 1.11版本中的Go Modules,并且很快成为 一统江湖的包管理方式 Go Modules已经成为目前最主流的包管理工具

    2024年02月03日
    浏览(38)
  • Go语言中的包管理工具之Go Path的使用

    GoLang 中常用的包管理的方式 1 )概述 常用的有三种 Go Path Go Vendor Go Modules 2 )发展历程 早期go的包管理存在很大缺陷,甚至可以说没有官方统一的包管理工具 一方面官方在努力发布一些实验性的包管理工具。 同时也出现了很多社区开发的包管理工具。 在官方和社区的包管理

    2024年02月03日
    浏览(44)
  • Git版本管理工具

    本文记录学习使用 Git 版本管理工具的学习笔记,通过阅读参考链接中的博文和实际操作,快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 Git使用教程-配置管理 git reset详解-CSDN博客 3、Git使用不完全指南:git/github/gitlab/gitee的区别,原理和常用命令总结_gitlab

    2024年03月20日
    浏览(64)
  • 代码版本管理工具 git

    1.  去B站看视频学习,只看前39集: 01-Git概述(Git历史)_哔哩哔哩_bilibili 2.学习Linux系统文本编辑器的使用 vi编辑器操作指令分享 (baidu.com) (13条消息) nano编辑器的使用_SudekiMing的博客-CSDN博客 windows 下载安装 Git 官方下载地址: Git - Downloading Package 安装图解: https://www.cnblogs

    2024年02月04日
    浏览(58)
  • GIT版本管理工具教程

    下载安装, 下载地址: https://git-scm.com/downloads 每个系统的都有(linux、mac、windows等),看官网的安装教程,很详细,此处我以windows来练习 首先创建一个文件夹,这个文件夹就是我们将来通过git来管理的所有文件的存放地点 。 在文件夹中右键 使用Git Bash 在弹出的窗口中执行

    2024年02月04日
    浏览(49)
  • 【Node】nvm 版本管理工具

    概念 nvm 全名 node.js version management,顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 下载 下载地址 打开网址我们可以看到有两个版本: nvm-noinstall.zip:绿色免安装版,但使用时需进行配置。 nvm-setup.zip:安装版,推荐使用 下载安装完毕后,打

    2024年02月12日
    浏览(50)
  • Python版本管理工具 pyenv

    源码: https://github.com/pyenv/pyenv # 编译 # 环境变量 # Python 版本安装 ## 默认下载地址: https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz ## 从国内镜像源下载不同版本 Python 包 ## 安装不同版本 Python # 设置 Python 版本 ### 更多命令使用请参考帮助文档:pyenv -h

    2024年02月16日
    浏览(44)
  • 5.git版本管理工具使用

    git是分布式版本管理工具 版本控制? 版本控制是一种记录文件或修改文件历史记录,让用户查看历史版本   集中版本控制 都有单一的集中管理服务器,保存所有文件的修订版本,开发者通过客户端连接这台服务器,取出最新文件或提交更新 缺点:中央服务器单点故障, 如

    2024年02月03日
    浏览(58)
  • Java多版本JDK管理工具

    GitHub - ystyle/jvms: JDK Version Manager (JVMS) for Windows 适用于 Windows 的 JDK 版本管理器 (JVMS),在Windows上轻松的管理多Java版本。 安装 https://github.com/ystyle/jvms/releases 初始化 从上面的链接下载完成 解压zip并将jvms.exe复制到你想要的路径 以管理员身份运行 cmd 或 powershell cd 到jvms.exe其中的

    2024年01月25日
    浏览(54)
  • git(项目版本管理工具)快速入门

    目录 1、git 1.1、git概述 1.2、git的服务器地址 1.3、git原理 2、客户端操作 2.1、初始化本地库 2.2、添加本地暂存区  2.3、提交本地库 2.4、修改文件 2.5、查看修改历史 2.6、查看版本差异 2.7、删除文件 2.8、文件还原 3、git命令 3.1、初始化本地库 3.2、查看本地仓库状态 3.3、添加本

    2023年04月12日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包