2017/10/18現在の情報です。

TLDR

  • 必要なものは基本Homebrew一発(二発?)で入ります。
  • 現時点でうまくいかないのはDelveのインストール。ただ、回避策あり。
  • Visual Source Codeはいいですよ!

バージョン

  • macOS Sierra 10.12.6
  • Homebrew 1.3.5
  • go version go1.9.1 darwin/amd64
  • Visual Source Code 1.17.2
  • Delve Debugger Version: 1.0.0-rc.2

前準備

Homebrewを入れてください。便利ですよ。

インストールはここから https://docs.brew.sh/Installation.html

ただし、複数ユーザでMac使う場合は注意が必要です。結構面倒になりますよ。 https://discourse.brew.sh/t/homebrew-permissions-for-multiple-users/686

Goのインストール

Homebrewを使ってインストールします。

$ brew install go
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
...
(snip)
==> Caveats
A valid GOPATH is required to use the `go get` command.
If $GOPATH is not specified, $HOME/go will be used by default:
https://golang.org/doc/code.html#GOPATH

You may wish to add the GOROOT-based install location to your PATH:
export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
🍺 /usr/local/Cellar/go/1.9.1: 7,639 files, 293.7MB

環境変数について

他のサイトを見ると$GOROOT$GOPATHの設定が必要とあるけど、実はなくても大丈夫です。

まず$GOROOTについては下記に書いてある通りGOのインストール先をデフォルトの場所から変える場合にのみ必要です。

Installing to a custom location

The Go binary distributions assume they will be installed in /usr/local/go (or c:\Go under Windows), but it is possible to install the Go tools to a different location. In this case you must set the GOROOT environment variable to point to the directory in which it was installed.

For example, if you installed Go to your home directory you should add commands like the following to $HOME/.profile:

export GOROOT=$HOME/go1.X export PATH=$PATH:$GOROOT/bin

Note: GOROOT must be set only when installing to a custom location.

引用)https://golang.org/doc/install#install

また、$GOPATHですがこちらもデフォルトの場所($HOME/go)から変えたい場合のみ必要です。こちらはインストール時のメッセージにも書いてありますね。

Test your installation

Check that Go is installed correctly by setting up a workspace and building a simple program, as follows.

Create your workspace directory, $HOME/go. (If you’d like to use a different directory, you will need to set the GOPATH environment variable.)

引用)https://golang.org/doc/install#install

あとは$PATHの設定。インストール時のメッセージは以下な感じですが、Homebrew側で設定されているはずなので大丈夫。。。なはずです。

(2017/10/31 追加 begin)

ダメですね(汗 GOのパッケージ構成に従うべきでした。 例えばgo getでインストールしたツールがパスが通っていないのでそのままでは使えなくなってしまいます。混乱の元です😭

と言うことで素直にメッセージに従いましょう!

You may wish to add the GOROOT-based install location to your PATH: export PATH=$PATH:/usr/local/opt/go/libexec/bin

私の場合はBashを使っているので以下でOKです。

$ echo 'export GOPATH=$HOME/go' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bash_profile
$ source ~/.bash_profile

(2017/10/31 追加 end)

念のため確認してみます。

$ go version
go version go1.9.1 darwin/amd64

OKですね🍺

Hello World!

とりあえず、コンパイルできるところまで確認しましょう。 以下のように$HOME/goにhelloディレクトリを作成し、hello.goを追加してください。

$ mkdir -p ~/go/src/hello
$ cd ~/go/src/hello
$ touch hello.go

hello.goをエディタで下記のように編集してください。

package main

import "fmt"

func main() {
fmt.Printf("hello, world\n")
}

ターミナルに戻ってまずはコンパイルして実行してみましょう。

$ ll
total 8
drwxr-xr-x 3 user staff 102 10 19 23:13 .
drwxr-xr-x 4 user staff 136 10 19 23:05 ..
-rw-r--r-- 1 user staff 77 10 19 23:12 hello.go
$ go build
$ ll
total 3816
drwxr-xr-x 4 user staff 136 10 19 23:14 .
drwxr-xr-x 4 user staff 136 10 19 23:05 ..
-rwxr-xr-x 1 user staff 1949648 10 19 23:14 hello
-rw-r--r-- 1 user staff 77 10 19 23:12 hello.go
$ ./hello
hello, world

良さそうですね!

Visual Studio Codeのインストール

下記からダウンロードし、手順に従ってインストールしてください。特に迷わないはず。 おそらく展開してからアプリケーションディレクトリへのコピーだけで大丈夫なはずです。

https://code.visualstudio.com/download

Go用の機能拡張のインストール

Visual Studio Codeを使うのなら、機能拡張のインストールは必須です!

Visual Studio Codeを起動して機能拡張からインストールします。 ハリネズミ?のアイコンが目じるしです。 ちなみにGo言語のマスコットでいろんなところでちょこちょこ見ることになるかとw

Visual Studio CodeへのGo拡張機能のインストール

Hello WorldをVisual Studio Codeで実行する

Visual Studio Codeで~/go/src/helloを開いてください。 デバッグの開始とあるのでF5を押してみます。

環境の選択でGoを選ぶと…

エラーが発生しているようです。Analysic Tools Missingが表示されました。 クリックしてみます。

Go analysis toolsがないみたいのなのでinstallをクリック

しばらく待たされましたが、全部インストールに成功したようです。

インストールされたツールがきちんと動作するか確認します。まずはコード整形ツールgofmtが動いているか確認してみます。まずはエディタを開いてみると、今はきちんと整形されています。

これを、下記のように修正してみました。この状態でファイルを保存すると…

自動で整形されました!赤で囲った枠の中は、そのほかにもgolintなどもきちんと動いていることが確認できます。

それでは、もう一回デバッグしてみましょう。F5を押してみてください。

Delve debuggerがないと怒られてしまいました。今度はDelve debuggerのインストールです。

Delve debuggerのインストール

Homebrewからインストールできるのですが。。。まぁ試してみましょう。

$ brew install delve
==> Installing delve from go-delve/delve
==> Downloading https://github.com/derekparker/delve/archive/v1.0.0-rc.1.tar.gz
==> Downloading from https://codeload.github.com/derekparker/delve/tar.gz/v1.0.0-rc.1
######################################################################## 100.0%
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
==> Generating dlv-cert
==> openssl req -new -newkey rsa:2048 -x509 -days 3650 -nodes -config dlv-cert.cfg -extensions codes
==> [SUDO] Installing dlv-cert as root
==> sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain dlv-cert.ce
Last 15 lines from /Users/user/Library/Logs/Homebrew/delve/02.sudo:
2017-10-20 00:18:21 +0900

sudo
security
add-trusted-cert
-d
-r
trustRoot
-k
/Library/Keychains/System.keychain
dlv-cert.cer


If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):
https://github.com/go-delve/homebrew-delve/issues

/usr/local/Homebrew/Library/Homebrew/utils/github.rb:210:in `raise_api_error': GitHub (GitHub::AuthenticationFailedError)
The GitHub credentials in the macOS keychain may be invalid.
Clear them with:
printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase
Or create a personal access token:
https://github.com/settings/tokens/new?scopes=gist,public_repo&description=Homebrew
and then set the token as: export HOMEBREW_GITHUB_API_TOKEN="your_new_token"
from /usr/local/Homebrew/Library/Homebrew/utils/github.rb:178:in `open'

from /usr/local/Homebrew/Library/Homebrew/utils/github.rb:278:in `search'
from /usr/local/Homebrew/Library/Homebrew/utils/github.rb:225:in `search_issues'

from /usr/local/Homebrew/Library/Homebrew/utils/github.rb:238:in `issues_for_formula'
from /usr/local/Homebrew/Library/Homebrew/exceptions.rb:369:in `fetch_issues'

from /usr/local/Homebrew/Library/Homebrew/exceptions.rb:365:in `issues'
from /usr/local/Homebrew/Library/Homebrew/exceptions.rb:419:in `dump'

from /usr/local/Homebrew/Library/Homebrew/brew.rb:135:in `rescue in <main>'
from /usr/local/Homebrew/Library/Homebrew/brew.rb:30:in `<main>'

派手にエラーが出ます。 これは、インストール処理時にデバッグ時に必要な証明書の作成するのですが、それに失敗するためです。

この解決方法はここに記載があります。 そんなわけでやってみましょう。

$ cd ~/Library/Caches/Homebrew/
$ tar -zxvf delve-1.0.0-rc.1.tar.gz
x delve-1.0.0-rc.1/
x delve-1.0.0-rc.1/.gitattributes
x delve-1.0.0-rc.1/.gitignore
x delve-1.0.0-rc.1/.travis.yml
(snip)
$ cd delve-1.0.0-rc.1/scripts/
$ /gencert.sh
$ Password:

これでキーチェーンアクセスに証明書dlv-certができているはずです。

この状態でもう一度brew install delveを試してみます。

$ brew install delve
==> Installing delve from go-delve/delve
==> Downloading https://github.com/derekparker/delve/archive/v1.0.0-rc.1.tar.gz
(snip)

When uninstalling, to remove the dlv-cert certificate, run this command:

$ sudo security delete-certificate -t -c dlv-cert /Library/Keychains/System.keychain

Alternatively, you may want to delete from the Keychain (with the Imported private key).

==> Summary
🍺 /usr/local/Cellar/delve/1.0.0-rc.1: 6 files, 10.7MB, built in 18 seconds

今度は成功しました🍺

それではVisual Studio Sourceでデバッグしてみます。hello.goを開いた状態でF5で実行してみます…お、今度は成功しました🍺

デバッグ成功

あとは、ブレークポイントを設定したりもできますので動かしてみてください。 これで終了です!!と言いたいところですが。。。実はテストのデバッグができません。

ちなみにテストのデバッグは各テスト関数の右上のdebug testをクリックすると実行できます。

テストのデバッグ失敗

こんなエラーが出てしまっています…

could not launch process: dial tcp :61932: getsockopt: connection refused
Process exiting with code: 1

これもここに解決策がかいてあります。解決策とはちょっと違いますが、以下でも大丈夫みたいです。 最新版をインストールします。

$ brew unlink delve && brew install delve --HEAD

今度はどうでしょうか…できました🍺

テストのデバッグ成功

これで完了です。

Delveを入れ替えたことによる仕様変更について

実はDelveを--HEADと入れ替える前(Version: 1.0.0-rc.1)と後(Version: 1.0.0-rc.2)で、デバッグ時にプログラムに与える引数の指定の仕方が変わります。

Visual Studio Codeのメニューからデバッグ - 構成を開くでデバッグ起動時の設定ができ、引数はargs=[]に設定します。

テストのデバッグ成功

この指定の仕方が例えば、./hello fuga hogeの場合

Version: 1.0.0-rc.1 args=["--", "fuga", "hoge"]
Version: 1.0.0-rc.2 args=["fuga", "hoge"]

となります。ほかにもあるかもしれませんが、特に気づきにくいところかと。。。

最後に

まだまだ記事が少ないGolangで、delveのような不具合にぶつかると途端に調べまくらないといけなかったのでまとめてみました。 誰かの役に立てばと。

それでは楽しいGolangライフを!🍺🍺