話題になっていたので、読んでみました。
[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 ですね。