go-dnssd というのを書いた。

typester さんが最近めっちゃ推してるので、そろそろと思ってgo 言語を始めた。習作として、ちょうど欲しいと思ってた dnssd ( bonjour ) の wrapper を書いた。ただ、register は自分で使うイメージがわかないので、discovery な関数のみに今はなっている。

soh335/go-dnssd · GitHub

go 言語は普通に書いていてもポインタとか型を意識させられるせいか、 c binding みたいなのが書きやういように思えた。
ただ、思ったより binding ライブラリの数が少なくて、ポータリビティを上げるために go 言語だけで実装してるんじゃないかな?みたいな話をした。

perl の xs では挫折する事が多かったが一応自分の手元では使えるものが出来たし、いろいろ面白いので go 言語は暫く続けようと思う。

reflect

いろいろな型の channel を扱う際に close だけをしたいみたいな場合は

c1 := make(chan bool)
c2 := make(chan interface{})

vc1 := reflect.ValueOf(c1) // reflect.Value 型になる
vc2 := reflect.ValueOf(c2) // reflect.Value 型になる

vc1.Close()
vc2.Close()

とすることで close だけの処理は共通に扱うことが出来る。

defer C.free(unsafe.Pointer(cstring))

C.Cstirng(...)

で、*C.char 型に変換できるが、その直後に上のを書いておくと関数を抜ける時に解放出来るので忘れなくてよいと思った。

unpack

perl では unpack("n", ...) のように書くがこれは

var data []bytes;
... // 初期化

var a uint16
reader := bytes.NewReader(data)
binary.Read(reader, binary.BigEndian, &a)

みたいな感じで書くよう。