Golang 环境构建时的备忘录

概述

    • golang の学習を始めるにあたり手元で go開発環境の整備を行った時のメモ

 

    改訂2版 みんなのGo言語 (https://www.amazon.co.jp/dp/4297107279) を参考にしました

前提
“`
在中文中,只需要一种选择来释义上述内容:
“`
前提

    mac環境での構築例

在这篇文章中所做的事情。

    • go 本体を導入する

 

    • GOROOT GOPATHについて確認する

 

    • hello world してみる

 

    • gore 等のパッケージ導入をしてみる

 

    ghq + peco を導入する

構築 Golang 的开发环境

安装go语言

    • 公式サイトを確認 https://golang.org/dl/

macでbrewを用いる場合

> brew install go
> go version
go version go1.19.3 darwin/arm64
    以後 go1.19.3 での事例

GO根目录设置

    • GOROOTはgo env GOROOT で確認できる。

 

    • goのインストールパスのことをGOROOTと呼ぶ。

 

    • 以前はGOROOTは環境変数に設定する必要があったが、最近はGoのバイナリにGOROOT情報が含まれるため明示的に環境変数を指定する必要は無いらしい。

 

    • インストールディレクトリを自分で変更した場合は GOROOT環境変数で指定する必要がある。とのこと。

 

    brew でインストールした場合は /usr/local/opt/go/libexec になるっぽい

GOPATH的设置

    • GOPATHは go env GOPATH で確認できる。

 

    • GOPATH はgo get で取得した外部パッケージのリソースが保存されるパス。

 

    • 以前はGoの開発を GOPATH 以下で行うことが多かったが、現在はあまり気にする必要が無くなったらしい(書籍によると)

 

    • デフォルトでは $HOME/go。環境変数GOPATHを設定することで上書きも可能。

 

    外部パッケージのリソースは GOPATH配下に配置されるため $PATH を通しておく。
export GOPATH=$(go env GOPATH)
export PATH=$PATH:$GOPATH/bin
    shell の初期化ファイルに組み込むとよさそう (.zshrc や .bashrc)

你好世界,试试看

    適当なディレクトリで hello-world.go というファイルをエディタで作成する
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello World")
}

执行

    単一ファイルをbuildせずに実行する
> go run ./hello-world.go
Hello World
    単一ファイルをbuildして、バイナリを実行する
> go build ./hello-world.go
> ./hello-world
Hello World

去获取一个由go get指令添加的软件包。

go getは PerlのCPANや Ruby のgem のようなパッケージをインストールするコマンド
CPANやgemとは仕組みが異なり 中央サーバーを持たず、Git やMercurial等のリポジトリを直接参照する。とのこと

去安装 gore 软件试试看。

    • gore というパッケージをインストールしてみる( https://github.com/x-motemen/gore )

 

    リポジトリのreadme に従いコマンドを実行します。
> go get github.com/x-motemen/gore/cmd/gore

> gore --version
gore 0.5.5 (rev: HEAD/go1.19.3)

go get後のGOPATHの中を確認してみる

> ls $GOPATH
bin/ pkg/

bin/ には取得した実行形式のファイル、pkg/ には取得したソースファイルが配置される

go get で取得するパッケージの対応バージョンが古いと pkg/ではなく src/ になる場合もある

> ls $GOPATH/bin
gore*

> ls $GOPATH/pkg/mod/github.com/x-motemen/gore@v0.5.5/
(省略)

尝试欣赏恐怖内容

gore は Goの代表的なREPL(Read-eval-print loop)、rubyの irb や pry Perl のreply のように対話的にプログラムを実行し評価を出力する環境。
開発者 motemenさんの記事 https://motemen.hatenablog.com/entry/2015/02/go-repl-gore

“Hello World” の例

> gore -autoimport
gore version 0.5.5  :help for help
gore> fmt.Println("Hello World")
Hello World
12
nil
gore>
    “Hello World”以後の表示、12 は 12バイト、nil は Printlnの戻り値を表している。12バイト出力され、エラーは無かったと読み取れる

附加工具

    • 参考にした書籍によると gore を便利に使うためにコード補完 gocode (https://github.com/mdempsky/gocode) 、プリティプリント pp (https://github.com/k0kubun/pp) というパッケージも導入すると良いとのことだった

 

    • 今回の環境は goのバージョンが 1.19 のため go get ではエラーとなって困ったが GO11MODULE=offを環境変数に追加することで導入はできた

 

    調べたところでは GO11MODULE は go1.11 から導入されたモジュールモードの指定。go 1.16以後ではデフォルトは on になっているようだった。
> GO111MODULE=off go get -u github.com/mdempsky/gocode
> GO111MODULE=off go get -u github.com/k0kubun/pp

ls $GOPATH を確認すると pkg/ 以外に src/ ディレクトリが増えていた

> ls $GOPATH
bin/ pkg/ src/
    が、gocode は開発が終了しており gopls(https://github.com/golang/tools/blob/master/gopls )を使った方が良いらしいのでそちらも導入する
> go install golang.org/x/tools/gopls@latest
> gopls version
golang.org/x/tools/gopls v0.10.1
    golang.org/x/tools/gopls@v0.10.1 h1:JoHe17pdZ8Vsa24/GUO8iTVTKPh0EOBiWpPop7XJybI=
    とりあえず入ったっぽい

引进 GHQ 和 PECO

    • go開発に限らずghqとpecoを導入するとソース/プロジェクトの管理が楽になるので導入するとたいへん良い

 

    • ghq (https://github.com/x-motemen/ghq), peco (https://github.com/peco/peco)

 

    以下は macでの導入例。brew で簡単に導入できた
> brew install ghq
> brew install peco
    brewでのインストール後、下記のようなコードを .zshrc で^ + ] キーのショートカットをzshに登録することで ghq+peco をより便利に使うことができる
bindkey '^]' peco-src
function peco-src () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
  zle -R -c
}
zle -N peco-src
    ghq + peco で検索するとたくさんの情報があるので参考にすると良さそう

其他

查看环境变量

go env コマンドで環境変数を確認できる

> go env
GO111MODULE=""
GOARCH="arm64"
GOBIN=""
GOCACHE="$HOME/Library/Caches/go-build"
GOENV="$HOME/Library/Application Support/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="$HOME/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="$HOME/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/opt/homebrew/Cellar/go/1.19.3/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/opt/homebrew/Cellar/go/1.19.3/libexec/pkg/tool/darwin_arm64"
GOVCS=""
GOVERSION="go1.19.3"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/qg/t8bjybn92zz8sq7cb0lycmpr0000gn/T/go-build1237653337=/tmp/go-build -gno-record-gcc-switches -fno-common"

印象

    • go開発入門環境としては上記で開発を開始できた。

 

    • その他開発時にはエディタの補助ツールをいろいろ導入してカスタマイズするのが良さそう。

go get go install周りは歴史的な話がいくつか出て来てコマンドが通らず困った場面もあった。パッケージの仕組みなどは調べる必要がありそう。
バイナリをbuildせずに実行できる方法もあるのは知らなかった。