Help us understand the problem. What is going on with this article?

今日から始めるGolang【コマンド集】

More than 1 year has passed since last update.

今回はgoに備え付けられているコマンドをご紹介します。

コマンド一覧

go help

困った時には、何はともあれヘルプを見てみましょう。

$ go help
Go is a tool for managing Go source code.

Usage:

        go command [arguments]

The commands are:

        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        bug         start a bug report
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         download and install packages and dependencies
        install     compile and install packages and dependencies
        list        list packages
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         report likely mistakes in packages

Use "go help [command]" for more information about a command.

Additional help topics:

        c           calling between Go and C
        buildmode   build modes
        cache       build and test caching
        filetype    file types
        gopath      GOPATH environment variable
        environment environment variables
        importpath  import path syntax
        packages    package lists
        testflag    testing flags
        testfunc    testing functions

Use "go help [topic]" for more information about that topic.

go build

Goのプログラムをビルドするためのコマンドである。
オプションなどが多々あり少し混乱することがあるので、
下記のようなディレクトリがあるとして話を進める。

app
┣ config.go // package main
┗ main.go // package main

この状況でappディレクトリ直下でgo buildを実行すると、appという名前の実行ファイルが生成される。

build実行時に特定のファイルやパッケージを指定しない場合には、
カレントディレクトリの*.goファイルの全てに対してコンパイルし、
そのビルド結果をカレントディレクトリの名前をもつ実行ファイルとして生成する。

またimportで外部のパッケージに依存している場合でも、依存先のパッケージも合わせてビルドしてくれるため、
開発者は依存するパッケージの場所などをファイルに記載する必要はない。

app
┣ app // 実行ファイルが追加される
┣ config.go // package main
┗ main.go // package main

-xオプションをつけることで、ビルド実行時のログを表示することができる。
ビルド時にエラーが出る際には、このようにログを出してみると何かヒントが得られるかもしれない。

$ go build -x
WORK=/var/folders/rt/659tpm_95t73f1_2dq5zjwpm0000gn/T/go-build175319691
mkdir -p $WORK/b001/
cat >$WORK/b001/importcfg << 'EOF' # internal
# import config
packagefile fmt=/usr/local/Cellar/go/1.10.2/libexec/pkg/darwin_amd64/fmt.a
packagefile math/rand=/usr/local/Cellar/go/1.10.2/libexec/pkg/darwin_amd64/math/rand.a
packagefile runtime=/usr/local/Cellar/go/1.10.2/libexec/pkg/darwin_amd64/runtime.a
EOF
// まだまだ続く...

go install

パッケージや実行ファイルをビルドした結果を、環境変数GOPATH内の特定の場所にインストールする。
go installは実行の過程go buildによるビルド処理も行っている。
go installを実行することで、$GOPATH/src配下に置かれたパッケージのソースコードをビルドし、
そのビルド結果が実行ファイルであれば$GOPATH/binへ、
それ以外であれば$GOPATH/pkgへインストールされる。

go get

外部パッケージのダウンロードとインストールをまとめて実行するコマンドである。
具体的な動作としては、指定したパスからパッケージのソースコードをダウンロードし、対象のパッケージに対してgo installを実行している。

引数は主に次のものがある

引数 意味
-u 対象のパッケージの更新と依存パッケージの更新を検出し、パッケージの再ダウンロードとインストールを実行する
-d 対象パッケージのダウンロードのみを行い、その後停止する
-t 対象パッケージに付属するテストが依存するパッケージも合わせてダウンロードする

go run

ビルドとプログラムの実行を一緒にやってくれる。
簡易的に動作確認したい場合などに有効である。

go env

Goのビルドシステムに関連する環境変数の内容を確認できる。
あの環境変数の設定ってどうだっけ?となったらひとまず叩いてみるといいかもしれない。

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/croco/Library/Caches/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/croco/go"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.10.2/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.10.2/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/rt/659tpm_95t73f1_2dq5zjwpm0000gn/T/go-build892773146=/tmp/go-build -gno-record-gcc-switches -fno-common"

たまに確認しそうは環境変数は下記かなと。

環境変数 内容
GOARCH コンパイラが対象とするCPUアーキテクチャ
GOBIN go installによってインストールされるコマンドの格納ディレクトリ。デフォルトでは$GOPATH/binとなる
GOOS コンパイラが対象とするOS環境
GOPATH パッケージのソースコードとオブジェクトファイル、実行ファイルなどが格納されるディレクトリ
GOROOT Go本体のインストール元

go fmt

Goのソースコードを推奨される形式へ自動的に整形するためのコマンドである。
go fmtは文法エラーのチェック、インデントや空行の適正化、不要な空白などの削除などを行う。
コマンドはgo fmt [-n] [-x] [packages]という感じである。

例えば下記のようなコードがあったとして、 go fmtと叩く

main.go
package main

import(
"math/rand"
"fmt"
)

func main() {
i := rand.Intn(10)

        fmt.Println(i)
}

すると下記のようにインデントなどを綺麗に整えてくれる。

main.go
package main

import ( // インデントだけでなく、アルファベット順に並び替えられている!
    "fmt"
    "math/rand"
)

func main() {
    i := rand.Intn(10)

    fmt.Println(i)
}

ちなみに、
-nオプションは実行されるコマンドの表示のみを行いたい場合につける(実行してもファイルは書き換えられない)
-xオプションは実行されるコマンドを表示する

$ go fmt -n
/usr/local/Cellar/go/1.10.2/libexec/bin/gofmt -l -w main.go

go doc

Goのパッケージのドキュメントを参照するためのコマンドである。
このパッケージの使い方ってなんだっけ、となった際に叩いてみるといいかもしれない

例えばfmtパッケージの場合は下記のような情報が返される

$ go doc fmt
package fmt // import "fmt"

Package fmt implements formatted I/O with functions analogous to C's printf
and scanf. The format 'verbs' are derived from C's but are simpler.


Printing

The verbs:

General:

    %v  the value in a default format
        when printing structs, the plus flag (%+v) adds field names
    %#v a Go-syntax representation of the value
    %T  a Go-syntax representation of the type of the value
    %%  a literal percent sign; consumes no value

Boolean:

    %t  the word true or false

// まだまだ続く...

また、パッケージの後にピリオドで区切るとパッケージの特定の関数などを指定することもできる。
fmt.Println関数のドキュメントを参照する場合は下記のような情報が返される。

$ go doc fmt.Println
func Println(a ...interface{}) (n int, err error)
    Println formats using the default formats for its operands and writes to
    standard output. Spaces are always added between operands and a newline is
    appended. It returns the number of bytes written and any write error
    encountered.

go test

goのパッケージに付属しているテストを実行するためのコマンドである。
-coverオプションをつけることでテストのカバレッジ率を計測することもできる。

合わせて読みたい

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away