みんなのGo言語を読んだ

WindowsLinuxMacOSで動くTUI(CUI)ツールや社内ツールを作るためにGoをどう書くのか?という視点で書かれていた。

2016/09/09に発売された本で5年前の本なのでいまのGoは進化してそう。

2019/08/01に発売された改訂2版では「第7章 データベースの扱い方」が追加されている。

gore, ghq, peco, gofmt, goimport, go vet, golint, godoc, gorename, guru, gocode, godef, gotags, A Tour of Go, vendoring, glide, Effective Go, panic(正規表現, map, reflect, 巨大なstruct)を使わない, 並行処理を使いすぎない, path/filepath, termbox, go-bindata, go-assets, bufio, go-humanize, defer, goroutine, シングルバイナリ, マルチプラットフォーム, パフォーマンス, reflect, HerokuのCLIRubyからGoに書き直されたというようなキーワードが展開されていた。

goroutineをContextで途中でキャンセルするサンプルコードが載っていたので手元で動かしてみたりした。

go some_function()のように書くだけで並列処理になる、他にもスレッドセーフにするためにmapをstructにするなど気をつけないといけないことがある。

// go run cancel_goroutine.go
package main

import (
    "context"
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {
    // create Contect for Cancel
    ctx, cancel := context.WithCancel(context.Background())
    queue := make(chan string)
    for i := 0; i < 2; i++ {
        wg.Add(1)
        go fetchURL(ctx, queue)
    }

    queue <- "http://www.example.com"
    queue <- "http://www.example.net"
    queue <- "http://www.example.net/foo"
    queue <- "http://www.example.net/bar"

    cancel()
    wg.Wait()
}

func fetchURL(ctx context.Context, queue chan string) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("worker exit")
            wg.Done()
            return
        case url := <-queue:
            fmt.Println(url)
        }
    }
}

goroutineとシングルバイナリが魅力的。

Serf, Consul, Terraform, prometheus, クックパッドAmebaはてなブログ、 メルカリ、メルペイ, AWA, Schoo, ぐるなび, Pixiv, Gunosy, サイバーエージェント, Kyash, DELISH KITCHEN, Pairs, Wish, CoinBase, Epic Games, Palantir, Juul Labsなどで使われている模様。

メルペイが一番がっつりGoを使ってそうな感じがするのであとで事例を調べてみたい。

GitHub - avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software https://github.com/avelino/awesome-go

awesome-goを見てみるとライブラリがごっそりある、データベースというかKey-Value Storeだったりゲームエンジンを作ってるひともいるみたいで面白い。

WebアプリケーションそのものをGoで作るのは主流じゃなくてシングルバイナリでオートスケールを早く簡単にできるようにしたり、goroutineでバッチ処理を高速化したりするのが主な使い方っぽい。