gvm安装及go版本管理

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"

本文作者:逢生博客

本文链接:https://www.cnblogs.com/wufengsheng/p/17755310.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   逢生博客  阅读(4466)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 晚安 顏人中
  2. 2 出山 花粥 / 王胜娚
  3. 3 我们俩 郭顶
  4. 4 日落大道 梁博
  5. 5 像鱼 王贰浪
  6. 6 把回忆拼好给你 王贰浪
  7. 7 时光背面的我 刘至佳 / 韩瞳
  8. 8 愿你余生漫长 王贰浪
  9. 9 追寻你 王天戈 / 川青
  10. 10 夜空中最亮的星 逃跑计划
  11. 11 孤勇者 陈奕迅
  12. 12 不为谁而作的歌 林俊杰
  13. 13 消愁 毛不易
  14. 14 这一生关于你的风景 隔壁老樊
晚安 - 顏人中
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.