生涯未熟

プログラミングをちょこちょこと。

Golang Weekly #167

Profiler labels in Go · Go, the unwritten parts

Go 1.9の新機能としてProfiler Labelsが追加されます。

CPUプロファイラの収集データにラベルを追加することが出来るようになり、
例えば一般的なWebサーバにgoroutineでハンドラが分割された /user/top が存在する場合、
それぞれのgoroutineに対して /user /top のラベルを貼っておけば、pprofのREPLから tags を実行することで各々のCPUプロファイラ結果が見れるようになります。便利!

この辺りを記事書いている方が少ないので、改めて別記事として書こうと思います。

GitHub - tidwall/shiny: Alternative server framework for Go using I/O multiplexing

Goの新しいWAFなんですが、一番特徴的なのがI/O多重化の際にnetパッケージを用いず、直接epoll / kqueueを呼んでいるところですね。

作者のtidwall氏が挙げている特徴は以下の4つ。

  • 1つのエントリポイントと4つのイベント関数のみのシンプルなAPI
  • メモリ使用量が少ない
  • 非常に高速なシングルスレッドサポート
  • netパッケージでイベントをシミュレートすることによって、epoll / kqueueのないOSをサポート

今後どうなるか見守りたいWAFになりそうですね。

Golang Internals Part 2: Nice benefits of named return values

条件分岐によって、初期化されたオブジェクトを返すような処理の際には名前付き結果パラメータを使おうぜというお話。
ちょっとの違いで、コンパイラの生成コードがここまでスッキリするとは驚きですね。

また、deferで呼び出す関数内で名前付き結果パラメータを参照することが出来るので、

package main

import (
    "fmt"
    "strconv"
)

func main() {
    i := incrInt(1)
    fmt.Println(strconv.Itoa(i)) // print 2
}

func incrInt(i int) (result int) {
    defer func() { result++ }()
    return i
}

といった面白いコードが書けたりします。

ちょっと少ないですが、今回はここまで。