gvm安装及go版本管理 - 逢生博客

博客园 · · 95 次点击 · · 开始浏览    

Github

官方地址

Mac OS X 要求

xcode-select --install
brew update
brew install mercurial

红帽/Centos

sudo yum install curl
sudo yum install git
sudo yum install make
sudo yum install bison
sudo yum install gcc
sudo yum install glibc-devel

多版本管理

Github

gvm安装

brew install mercurial
# 安装 gvm
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
# gvm直接生效
source ~/.gvm/scripts/gvm
# 查看版本
gvm version

环境变量

vim ~/.zshrc
vim ~/.bash_profile
  • 添加如下内容
# 配置 Golang 软件包镜像
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,direct
# 下载 Golang 的二进制文件或源码压缩包进行安装
export GO_BINARY_BASE_URL=https://mirrors.aliyun.com/golang/
# 根据软件的实际安装情况来选择性加载 gvm
[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"
# 确保 Golang 使用源码编译安装时,不会出错(golang 1.14后需要 )
export GOROOT_BOOTSTRAP=$GOROOT
# 生效配置
source ~/.zshrc
source ~/.bash_profile

官方国内镜像:https://golang.google.cn/dl/
阿里云镜像:https://mirrors.aliyun.com/golang/
中科大镜像:http://mirrors.ustc.edu.cn/golang/

常用命令

# 查看可安装版本
gvm listall
# 查看已安装版本
gvm list
# 安装 Go 版本(1.4>版本,需要加上-B)
gvm install go1.21.2 -B
# 使用指定版本
gvm use go1.21.2
# 设置默认版本
gvm use go1.21.2 --default
# 卸载 Go 版本
gvm uninstall go1.21.2
# 要完全删除 gvm 以及所有已安装的 Go 版本和软件包
gvm implode

安装 Go

gvm install go1.4 -B
gvm use go1.4
# export GOROOT_BOOTSTRAP=$GOROOT
# 安装1.7+版本需要先安装1.4
gvm install go1.17.13 -B
gvm use go1.17.13
# export GOROOT_BOOTSTRAP=$GOROOT
# 安装1.20+版本需要先安装1.17
gvm install go1.21.2 -B
gvm use go1.21.2
# 设置为默认版本
gvm use go1.21.2 --default
  • 安装完最新版,不需用到旧版本可以卸载
gvm uninstall go1.4
gvm uninstall go1.17.13
# 查看 Go 版本
go version
# 安装包缓存目录
rm -rf ~/.gvm/archive

Go 环境信息

# 打印 Go 语言环境信息
go env
名称 说明
CGO_ENABLED 指明cgo工具是否可用的标识。
GOARCH 程序构建环境的目标计算架构。
GOBIN 存放可执行文件的目录的绝对路径。
GOCHAR 程序构建环境的目标计算架构的单字符标识。
GOEXE 可执行文件的后缀。
GOHOSTARCH 程序运行环境的目标计算架构。
GOOS 程序构建环境的目标操作系统。
GOHOSTOS 程序运行环境的目标操作系统。
GOPATH 工作区目录的绝对路径。
GORACE 用于数据竞争检测的相关选项。
GOROOT Go 语言的安装目录的绝对路径。
GOTOOLDIR Go 工具目录的绝对路径。

pkgset工具

# 查看当前go版本环境下的pkgset,默认global
gvm pkgset list
# 创建pkgset
gvm pkgset create example
# 切换/使用对应的pkgset,相对应的 GOPATH 也会改变
gvm pkgset use example

代码示例

VS Code 安装Go插件

创建初始化项目

mkdir demo1
cd demo1
# 初始化项目
go mod init demo1
# 创建main.go文件
vim main.go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello, world!")
}

运行应用

# 直接运行
go run main.go
# 编译并运行
go build && ./demo1

web应用

package main

import (
	"log"
	"net/http"
)

func viewHandler(writer http.ResponseWriter, request *http.Request) {

	message := []byte("Hello, World!")

	_, err := writer.Write(message)

	if err != nil {
		log.Fatal(err)
	}
}

func main() {

	http.HandleFunc("/hello", viewHandler)
	err := http.ListenAndServe("localhost:8800", nil)
	log.Fatal(err)
}

运行服务

go run main.go

Gin Web 框架

# 创建项目录
mkdir web-service-gin
cd web-service-gin
# 创建一个可以在其中管理依赖项的模块
go mod init example/web-service-gin

代码示例

# 创建main.go文件
vim main.go
  • 完整代码
package main

import (
    "net/http"

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

// 相簿表示有关唱片相簿的数据
type album struct {
    ID     string  `json:"id"`
    Title  string  `json:"title"`
    Artist string  `json:"artist"`
    Price  float64 `json:"price"`
}

// 相簿切片到种子记录相簿数据
var albums = []album{
    {ID: "1", Title: "Blue Train", Artist: "John Coltrane", Price: 56.99},
    {ID: "2", Title: "Jeru", Artist: "Gerry Mulligan", Price: 17.99},
    {ID: "3", Title: "Sarah Vaughan and Clifford Brown", Artist: "Sarah Vaughan", Price: 39.99},
}

func main() {
    router := gin.Default()
    router.GET("/albums", getAlbums)
    router.GET("/albums/:id", getAlbumByID)
    router.POST("/albums", postAlbums)

    router.Run("localhost:8080")
}

// getAlbums以JSON形式响应所有相册的列表.
func getAlbums(c *gin.Context) {
    c.IndentedJSON(http.StatusOK, albums)
}

// postAlbums从请求正文中接收的JSON添加相册.
func postAlbums(c *gin.Context) {
    var newAlbum album

    // 调用BindJSON将接收到的JSON绑定到newAlbum.
    if err := c.BindJSON(&newAlbum); err != nil {
        return
    }

    // 将新相册添加到切片.
    albums = append(albums, newAlbum)
    c.IndentedJSON(http.StatusCreated, newAlbum)
}

// getAlbumByID查找ID值与ID匹配的相册参数,然后返回该相册作为响应.
func getAlbumByID(c *gin.Context) {
    id := c.Param("id")

    // 循环浏览相册列表,查找ID值与参数匹配的相册.
    for _, a := range albums {
        if a.ID == id {
            c.IndentedJSON(http.StatusOK, a)
            return
        }
    }
    c.IndentedJSON(http.StatusNotFound, gin.H{"message": "album not found"})
}

运行应用

# 下载并安装指定的包及其依赖
go get .
# 编译并运行
go run .
# 或
go run main.go
curl http://localhost:8080/albums \
    --header "Content-Type: application/json" \
    --request "GET"

本文来自:博客园

感谢作者:博客园

查看原文:gvm安装及go版本管理 - 逢生博客

95 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传