Goのインストール・環境変数・コマンド

Macにgoをインストールして、簡単な動作確認をします。GOROOT・GOPATHの役割、goコマンド(env, get, build, run, mod)、GoLandの使い方について確認していきます。

インストール

Goのバイナリは下記ページからダウンロードできます。

Downloads - The Go Programming Language

ここでは、Homebrewを利用して、Macにgoをインストールします。

$ brew install go

インストール後、goコマンドが実行できるか確認します。

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

Usage:

        go <command> [arguments]

The commands are:

        bug         start a bug report
        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         add dependencies to current module and install them
        install     compile and install packages and dependencies
        list        list packages or modules
        mod         module maintenance
        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:

        buildconstraint build constraints
        buildmode       build modes
        c               calling between Go and C
        cache           build and test caching
        environment     environment variables
        filetype        file types
        go.mod          the go.mod file
        gopath          GOPATH environment variable
        gopath-get      legacy GOPATH go get
        goproxy         module proxy protocol
        importpath      import path syntax
        modules         modules, module versions, and more
        module-get      module-aware go get
        module-auth     module authentication using go.sum
        module-private  module configuration for non-public modules
        packages        package lists and patterns
        testflag        testing flags
        testfunc        testing functions

Use "go help <topic>" for more information about that topic.

環境変数( go env )

go env を実行するとgoの環境変数について確認できます。

GOROOT

Goがインストールされた場所は、GOROOT で確認できます。

$ go env | grep GOROOT
GOROOT="/usr/local/Cellar/go/1.15.6/libexec"
$ ls -l /usr/local/Cellar/go/1.15.6/libexec
total 248
-rw-r--r--    1 xxx  staff   1339 Dec  4 02:32 CONTRIBUTING.md
-rw-r--r--    1 xxx  staff  95475 Dec  4 02:32 CONTRIBUTORS
-rw-r--r--    1 xxx  staff   1303 Dec  4 02:32 PATENTS
-rw-r--r--    1 xxx  staff    397 Dec  4 02:32 SECURITY.md
-rw-r--r--    1 xxx  staff      8 Dec  4 02:32 VERSION
drwxr-xr-x   21 xxx  staff    672 Dec  4 02:32 api
drwxr-xr-x    5 xxx  staff    160 Dec  4 02:32 bin
drwxr-xr-x   45 xxx  staff   1440 Dec  4 02:32 doc
-rw-r--r--    1 xxx  staff   5686 Dec  4 02:32 favicon.ico
drwxr-xr-x    3 xxx  staff     96 Dec  4 02:32 lib
drwxr-xr-x   14 xxx  staff    448 Dec  4 02:32 misc
drwxr-xr-x    6 xxx  staff    192 Dec  4 02:32 pkg
-rw-r--r--    1 xxx  staff     26 Dec  4 02:32 robots.txt
drwxr-xr-x   69 xxx  staff   2208 Dec  4 02:32 src
drwxr-xr-x  328 xxx  staff  10496 Dec  4 02:32 test

goコマンドなどは binフォルダ配下 に格納されています。

$ ls -l /usr/local/Cellar/go/1.15.6/libexec/bin/
total 65864
-rwxr-xr-x  1 xxx  staff  14125324 Dec  4 02:32 go
-rwxr-xr-x  1 xxx  staff  16145836 Dec  4 02:32 godoc
-rwxr-xr-x  1 xxx  staff   3447872 Dec  4 02:32 gofmt

GOPATH

外部から取得したパッケージの格納先を決める際、GOPATH の影響を受けます。

$ go env | grep GOPATH
GOPATH="/Users/xxx/go"

例として、echoをダウンロードしてみます。

$ go get github.com/labstack/echo/...
$ tree -L 1 /Users/xxx/go
/Users/xxx/go
├── pkg
└── src

src配下に echoパッケージechoの依存パッケージ のソースコードが格納されています。

$ tree -L 3 /Users/xxx/go/src
/Users/xxx/go/src
├── github.com
│   ├── dgrijalva
│   │   └── jwt-go
│   ├── labstack
│   │   ├── echo
│   │   └── gommon
│   ├── mattn
│   │   ├── go-colorable
│   │   └── go-isatty
│   └── valyala
│       └── fasttemplate
└── golang.org
    └── x
        ├── crypto
        ├── net
        ├── sys
        ├── text
        └── time

pkg配下にビルド後のパッケージオブジェクトが格納されています。

$ tree -L 4 /Users/xxx/go/pkg
/Users/xxx/go/pkg
└── darwin_amd64
    └── github.com
        └── labstack
            ├── echo
            └── echo.a

GoLandの設定

[GoLand] - [Preferences] を開きます。

775-go-install-env-command_goland-01.png

GOROOTの設定画面です。

775-go-install-env-command_goland-02.png

GOPATHの設定画面です。

775-go-install-env-command_goland-03.png

正しく設定されていれば、GO SDKとGOPATHについて表示されます。

Hello Worldの確認

main.goファイル を作り、以下処理を記述します。

package main

import "fmt"

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

go build

go buildコマンド で実行バイナリを生成できます。

$ go build main.go   
$ ls -l
total 4200
-rwxr-xr-x  1 xxx  staff  2142872  Dec  4 02:32 main
-rw-r--r--  1 xxx  staff       73  Dec  4 02:32 main.go

生成された実行バイナリを起動してみます。

$ ./main 
Hello world

go run

go runコマンド を利用するとビルドと実行を同時に行えます。

$ go run main.go   
Hello world

GoLandで実行・デバッグ

まずは通常実行を確認します。

775-go-install-env-command_goland-11.png

矢印箇所をクリックすると実行できます。

次にデバッグモードで実行する方法を確認します。

775-go-install-env-command_goland-12.png

ブレイクポイントを入れた状態で、デバッグを実行します。

775-go-install-env-command_goland-13.png

ブレイクポイントで処理が止まりました。

go modによるモジュール管理

Go言語の 1.11以上go modコマンド が使えるようになりました。依存モジュールを go.modファイルgo.sumファイル で管理できます。

go mod では以下のサブコマンドを利用できます。

$ go help mod
Go mod provides access to operations on modules.

Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.

Usage:

        go mod <command> [arguments]

The commands are:

        download    download modules to local cache
        edit        edit go.mod from tools or scripts
        graph       print module requirement graph
        init        initialize new module in current directory
        tidy        add missing and remove unused modules
        vendor      make vendored copy of dependencies
        verify      verify dependencies have expected content
        why         explain why packages or modules are needed

Use "go help mod <command>" for more information about a command.

go mod init

go mod initコマンド で初期化します。

$ go mod init example.com/xxx

go.mod ファイルが作成されました。

$ cat go.mod 
module example.com/xxx

go 1.15

go mod tidy

main.go に以下処理を記述します。

package main

import (
        "net/http"

        "github.com/labstack/echo/v4"
)

func main() {
        // Echo instance
        e := echo.New()

        // Routes
        e.GET("/", hello)

        // Start server
        e.Logger.Fatal(e.Start(":1323"))
}

// Handler
func hello(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
}

echoパッケージを利用しています。

go mod tidy を利用すると、依存モジュールを自動インストールして、使われていない依存モジュールを削除してくれます。

$ go mod tidy
go: finding module for package github.com/labstack/echo/v4
go: downloading github.com/labstack/echo v1.4.4
go: downloading github.com/labstack/echo/v4 v4.1.17
go: downloading github.com/labstack/echo v3.3.10+incompatible
go: found github.com/labstack/echo/v4 in github.com/labstack/echo/v4 v4.1.17
go: downloading github.com/labstack/gommon v0.3.0
  (省略)
$ cat go.mod 
module example.com/xxx

go 1.15
require github.com/labstack/echo/v4 v4.1.17

GoLandでModulesを有効にする

[GoLand] - [Preferences] を開きます。

775-go-install-env-command_goland-21.png

Enable Go modules integrationにチェックを入れます。

775-go-install-env-command_goland-22.png

Go Modulesが認識されました。