yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

Goで複数バージョンを共存させ、Moduleモードで実行する

2021-10-27

go1.13からModuleモードが推奨となり、GOPATHを定義しなくても良くなり、
これを機にgoenvを卒業してデフォルトのバージョン管理方法に移行した

go.1.13より前ではGOPATH配下でしかGoを動かせなかったのが、
go.modファイルがあるところはどこでも動くようになるらしい
さらに、パッケージや動作バージョンの管理がgo.modファイルでされるようになるらしい

Macにbrewで入れている最新バージョンがデフォルトで、
検証用として、デフォルトのGoから他のバージョンをインストール&管理するイメージ

  1. デフォルトで使うGoのインストールと準備
  2. 追加で別バージョンのGoをインストール
  3. 追加でインストールしたGoのプログラムをModuleモードで動かす

デフォルトで使うGoのインストールと準備

まだインストールしていない場合は、goをインストールしておく
自分の環境はMacなのでbrewでインストール

%  brew install go

最新バージョンがインストールされていることを確認
これがデフォルトで使うGoとなる

%  go version
go version go1.17.2 darwin/amd64

インストールされている場合はgoenvを消しておく

%  brew uninstall goenv
Uninstalling /usr/local/Cellar/goenv/1.15.0... (144 files, 245.4KB)

追加で別バージョンのGoをインストール

追加で別バージョンのGoをインストールしてみる
作業用ディレクトリを作成

%  mkdir go1.16.9_test
%  cd go1.16.9_test

少し古いバージョンのGoをインストールしてみる
どんなバージョンがあるかはこちら で確認できる
https://golang.org/dl/

今回は「go1.16.9」をインストールする
まずはgo get

%  go get golang.org/dl/go1.16.9
go: downloading golang.org/dl v0.0.0-20211007222857-6589945b0d11
go get: installing executables with 'go get' in module mode is deprecated.
	Use 'go install pkg@version' instead.
	For more information, see https://golang.org/doc/go-get-install-deprecation
	or run 'go help get' or 'go help install'.

go getだけでは使えなく、使おうとするとdowonloadしろと言われる
go getは基本的に管理情報を変えるのみで実際のインストールはしないコマンドだそうな

%  go1.16.9
go1.16.9: not downloaded. Run 'go1.16.9 download' to install to /Users/yoshi/sdk/go1.16.9

言われるがままにダウンロード

%  go1.16.9 download

これで1.16.9を使えるようになった

%  go1.16.9 version
go version go1.16.9 darwin/amd64

追加でインストールしたGoのプログラムをModuleモードで動かす

先ほどインストールした1.16.9で、プログラム(main.go)を動かしてみる

まずは、「go mod init」コマンドで、Moduleモードに欠かせない「go.mod」ファイルを作成する
バージョンを指定しないと、デフォルトのGo(brewでインストールしたやつ)で動いてしまうので注意

%  go1.16.9 mod init go1.16.9_test
go: creating new go.mod: module go1.16.9_test

これで、1.16.9版のgo.modが完成

%  cat go.mod
module go1.16.9_test

go 1.16

例えば、今回はこちらのコードを動かしてみる
https://github.com/fatih/colorというPackageを使っている

%  cat main.go
package main

import (
  "github.com/fatih/color"
)

func main() {
  color.Red("hello %s", "world")
  color.Blue("hello %s", "world")
}

この時点では必要Packageをインストールもgo.modに記載もしていないが、
「go mod tidy」コマンドで勝手にプログラムを参照して、go.modファイルをいい感じに書き換えてくれる
「go get 【Package】」でも書き換えてくれるが、go mod tidyの方がよしなにやってくれるので絶対便利

%  go1.16.9 mod tidy
go: finding module for package github.com/fatih/color
go: downloading github.com/fatih/color v1.13.0
go: found github.com/fatih/color in github.com/fatih/color v1.13.0
go: downloading github.com/mattn/go-colorable v0.1.9
go: downloading github.com/mattn/go-isatty v0.0.14
go: downloading golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c

go.modの中身を確認すると、https://github.com/fatih/colorを使うことがきちんと記載されている

%  cat go.mod
module go1.16.9_test

go 1.16

require github.com/fatih/color v1.13.0

あとはrunコマンドで無事に実行できることを確認できる
(runコマンドは、実行する際に必要に応じてインストールもやってくれるのでgo.modに書いてあるだけでOK)

%  go1.16.9 run main.go
hello world
hello world

colorはこんな感じで色をつけてくれるPackage
20211027_go

最終的なディレクトリ構成はこんな感じ
(go.sumは自動的に作られるファイル)

%  tree
.
├── go.mod
├── go.sum
└── main.go

0 directories, 3 files

控えめに言って、今風ですごく使いやすいと思った。
さすがアホでも書けるように設計されているGo!
これからちゃんと勉強したい。

以上。