几种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上,就会报错:

alt
# 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 )

也没有什么问题

alt

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

alt
alt

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
alt

选择版本

gvm use go1.11
alt

果然已经变为 Go 1.11


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

alt



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,始终是极好的选择

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

alt
alt



其他方案--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

alt

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




其他方案--brew


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

还可以用brew

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

(从1.16开始支持m1)

alt



问题解决


alt

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


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

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

alt


参考:

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




类似的工具还有g[6]

alt

某位大佬推荐 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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++包含整数各位重组

void 包含整数各位重组() {//缘由https://bbs.csdn.net/topics/395402016int shu 100000, bs 4, bi shu * bs, a 0, p 0, d 0;while (shu < 500000)if (a<6 && (p to_string(shu).find(to_string(bi)[a], p)) ! string::npos && (d to_string(bi…

【微服务部署】07-调用链追踪

文章目录 集成SkyWalking实现调用链追踪1. SkyWalking架构图2. 代码集成SkyWalking 集成SkyWalking实现调用链追踪 1. SkyWalking架构图 Receiver是SkyWalking的入口&#xff0c;支持gRPC和HTTP协议。 SkyWalking内部有分析和查询两个部分 存储方面SkyWalking支持Elasticsearc…

Windows下Git Bash调用rsync

rsync 提供了补充只需要在git安装目录下放入对应的文件即可。 需要将这个三个文件放到git的bin目录下 如果是默认安装路径是如下&#xff1a; C:\Program Files\Git\usr\bin 然后大功告成。

【Vue2】 axios库

网络请求库-axios库 认识Axios库为什么选择Axios库安装Axios axios发送请求常见的配置选项简单请求可以给Axios设置公共的基础配置发送多个请求 axios创建实例为什么要创建axios的实例 axios的拦截器请求拦截器响应拦截器 axios请求封装 认识Axios库 为什么选择Axios库 在游览…

105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 思路&#xff1a;题目给出了先序遍历和中序遍历的结果&#xff0c;因为先序遍历遵循根–>左–>…

21 自定义miniweb框架|闭包装饰器|log输出

文章目录 前情知识介绍WSIG-miniWeb框架服务器动态资源请求浏览器请求动态页面的全流程WSGIWSGI接口的定义 静态服务器回顾以及改造web 服务器 和 逻辑处理代码 分离 web动态服务器的基本实现带参数的web动态服务器 闭包装饰器闭包闭包的基础使用函数、匿名函数、闭包、对象修改…

Nat. Commun.2023 | AI-Bind+:提高蛋白质配体结合预测的通用性

论文标题&#xff1a;Improving the generalizability of protein-ligand binding predictions with AI-Bind 论文地址&#xff1a;Improving the generalizability of protein-ligand binding predictions with AI-Bind | Nature Communications 代码&#xff1a; Barabasi…

华为数通方向HCIP-DataCom H12-821题库(单选题:181-200)

第181题 某管理员需要创建AS Path过滤器(ip as-path-iter),允许AS_Path中包含65001的路由通过,那么以下哪一项配置是正确的? A、​​ip as-path-filter 1 permit 65001​​ B、​​ip as-path-filter 1 permit "65001​​ C、​​ip as-path-filter 1 permit *6500…

wxWidgets从空项目开始Hello World

前文回顾 接上篇&#xff0c;已经是在CodeBlocks20.03配置了wxWidgets3.0.5&#xff0c;并且能够通过项目创建导航创建一个新的工程&#xff0c;并且成功运行。 那么上一个是通过CodeBlocks的模板创建的&#xff0c;一进去就已经是2个头文件2个cpp文件&#xff0c;总是感觉缺…

Pygame中Trivia游戏解析6-3

3.3 Trivia类的show_question()函数 Trivia类的show_question()函数的作用是显示题目。主要包括显示题目框架、显示题目内容和显示题目选项等三部分。 3.3.1 显示题目的框架 在show_question()函数中&#xff0c;通过以下代码显示题目的框架。 print_text(font1, 210, 5, &q…

docker-compose 部署nacos 整合 postgresql 为DB

标题docker-compose 部署nacos 整合 postgresql 为DB 前提&#xff1a; 已经安装好postgresql数据库 先创建好一个数据库 nacos&#xff0c;执行以下sql: /** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the "…

二进制转换16进制 快速心算

1111 1110 ---> 0xFE 1111 为 8 4 2 1 ---> 8 4 2 1 15 --> 16进制表示为F1110 为 8 4 2 0 ---> 8 4 2 0 14 --> 16进制表示为E

Ubuntu本地快速搭建web小游戏网站,公网用户远程访问【内网穿透】

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互联网&am…

WebSocket(一)

一.什么是WebSocket 【1】WebSocket是一种协议&#xff0c;设计用于提供低延迟&#xff0c;全双工和长期运行的连接。 全双工&#xff1a;通信的两个参与方可以同时发送和接收数据&#xff0c;不需要等待对方的响应或传输完成。 【2】比较 传统通信&#xff08;http协议&am…

【LeetCode】1654:到家的最少跳跃次数的解题思路 关于力扣无法return的BUG的讨论

文章目录 一、题目二、题解与代码三、神奇的BUG3.1 无法执行的 return 和 break 语句3.2 通过另一个 break 解决 一、题目 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位…

java.sql.SQLException: com.mysql.cj.jdbc.Driver

这篇文章分享一下Springboot整合Elasticsearch时遇到的一个问题&#xff0c;项目正常启动&#xff0c;但是查询数据库的时候发生了一个异常java.sql.SQLException: com.mysql.cj.jdbc.Driver java.sql.SQLException: com.mysql.cj.jdbc.Driverat com.alibaba.druid.util.JdbcU…

软件测试/测试开发丨Pytest和Allure报告 学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/26755 Pytest 命名规则 类型规则文件test_开头 或者 _test 结尾类Test 开头方法/函数test_开头注意&#xff1a;测试类中不可以添加__init__构造函数 注…

Open3D(C++) 点云格网分块

目录 一、算法概述二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法概述 点云格网分块是点云二维格网化的一个具体应用案例,与Open3D (C++) 使用点云创建数字高程模型DEM类似,对每个格…

设计模式之装饰者模式

文章目录 星巴克咖啡订单项目&#xff08;咖啡馆&#xff09;方案 1-解决星巴克咖啡订单项目方案 1-解决星巴克咖啡订单问题分析方案 2-解决星巴克咖啡订单(好点)方案 2-解决星巴克咖啡订单问题分析装饰者模式定义装饰者模式原理装饰者模式解决星巴克咖啡订单装饰者模式下的订单…

YOLOv5算法改进(13)— 替换主干网络之PP-LCNet

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。PP-LCNet是一个由百度团队针对Intel-CPU端加速而设计的轻量高性能网络。它是一种基于MKLDNN加速策略的轻量级卷积神经网络&#xff0c;适用于多任务&#xff0c;并具有提高模型准确率的方法。与之前预测速度相近的模型相比…