話題になっていたので、読んでみました。

みんなのGo言語【現場で使える実践テクニック】 amazon.co.jp

[2015-02-11-1] で Go を学んだ私ですが、その後あまり使っていなかったので、情報をアップデートできて良かったです。

特に第1章の開発環境のあたり。goimports の import 自動挿入は良いですね。早速 go get して init.el に以下を設定しました(go-mode.el は導入済み)。

(setq gofmt-command "goimports")

第6章のテストも即戦力になりそうです。

以下は読んでメモった箇所を中心にしたまとめです。

全体を通して感じたこと

Go の文法が多少分かる方向けの本だと思います。P.19 にも書いてある「A Tour of Go 」などをやった後に読むと効果的だと思います。

ただ、世間でオススメされている「A Tour of Go」ですが、私はチュートリアルとしては難しいと思います。半分くらいから Go よりアルゴリズムのチュートリアルっぽくなってくるので。

個人的には [2015-02-11-1] で紹介した『WEB+DB PRESS Vol.82 』の「はじめてのGO」がオススメです。

残念だったこと

動かないコードがあったのは残念でした。

例えば第5章 reflect の P.108 です。コードを書いて動かすと、

package main

import (
	"fmt"
	"reflect"
)

type Point struct {
	X int
	Y int
}

func main() {
	p := &Point{X: 10, Y: 5}

	rv := reflect.ValueOf(p)
	fmt.Printf("rv.Type = %v\n", rv.Type())
	fmt.Printf("rv.Kind = %v\n", rv.Kind())
	fmt.Printf("rv.Interface = %v\n", rv.Interface())

	xv := rv.Field(0) // (1)
	fmt.Printf("xv = %d\n", xv.Int())
	xv.SetInt(100) // (2)
	fmt.Printf("xv (after SetInt) = %d\n", xv.Int())
}

(1) で panic を起こしてしまいます。

rv.Type = *main.Point
rv.Kind = ptr
rv.Interface = &{10 5}
panic: reflect: call of reflect.Value.Field on ptr Value

“p := Point{X: 10, Y: 5}” に変えても (2) で panic が起きます。

rv.Type = main.Point
rv.Kind = struct
rv.Interface = {10 5}
xv = 10
panic: reflect: reflect.Value.SetInt using unaddressable value

P.115 の最初のコードも動きませんでした。

package main

import "reflect"

type Point struct {
	X int
	Y int
}

func main() {
	p := Point{X: 10, Y: 5}
	rv := reflect.ValueOf(&p)

	if f := rv.Field(0); f.CanSet() {
		f.SetInt(100)
	}
}

panic: reflect: call of reflect.Value.Field on ptr Value

1.6 なら動くのかしら…? 1.7 は 8/15 に出たばかりだし。

$ go version
go version go1.7.1 darwin/amd64

少し残念だったこと

読んでいて誤植が多いなと思いました。査読に時間を割けなかったのですかね?

サポートページ に挙げられているもの以外には、以下を見つけました。

P.115
(誤) いったいどいうことでしょう。
(正) いったいどういうことでしょう。

P.134
(誤) reflectパッケージについては第2章をご覧ください。
(正) reflectパッケージについては第5章をご覧ください。

正誤表自体の間違いも見つけました。

reflect.SelectCase のページは P.97 ではなく P.117 ですね。