beroの日記: GoCon行ってきた
http://togetter.com/li/487380
http://takuan-osho.hatenablog.com/entry/2013/04/14/the-report-of-the-1st-go-conference-in-japan
http://moonstruckdrops.github.io/blog/2013/04/13/gocon-spring/
map遅いという話があったので、帰ってから少し調べてみた
結論から言えば
hoge := make(map[string]int);
hoge["hoge"] = 1;
は
pkg/runtime/hashmap.c
https://code.google.com/p/go/source/browse/src/pkg/runtime/hashmap.c?name=go1.0.3
内の
runtime·makemap
runtime·mapassign1
等を呼び出す。
コレ差し替えれば速くなるんじゃね?と思ったら絶賛書き換え中だった
https://code.google.com/p/go/source/browse/src/pkg/runtime/hashmap.c
ちなみにstructリテラルや配列リテラルはマジ定数だが、mapリテラルはmap初期化+挿入ループに落ちる。
fuga := map[string]int{"a":1,"b":2,"c":3}
は
kvs := []KeyVal{{"a",1},{"b",2},{"c",3}}
fuga2 := make(map[string]int);
for _,kv := range kvs {
fuga2[kv.k] = kv.v;
}
と同じ。
最初はA Tour of Goをやってた
あと何問残ってるかわからず心が折れそうだったが、右上の[]が目次だった
Exercise: Images
http://go-tour-jp.appspot.com/#59
で詰まった
http://go-tour-jp.appspot.com/#51
では、
func (v *Vertex) Scale(f float64) {
..
func main() {
v := &Vertex{3, 4}
でも
v := Vertex{3, 4}
でも、
v.Scale(5)
が呼べるんだが、
http://go-tour-jp.appspot.com/#59
だと、
...
func (img *Image) At(x, y int) color.Color { v:=uint8(x^y); return color.RGBA{v,v,255,255} }
func main() {
m := Image{256,256}
pic.ShowImage(m)
}
が
prog.go:18: cannot use m (type Image) as type image.Image in function argument:
Image does not implement image.Image (At method requires pointer receiver)
というエラーが出て動かない。
m := &Image{256,256}
pic.ShowImage(&m)
または
m := Image{256,256}
pic.ShowImage(&m)
だと動く。または
func (img Image) At(x, y int) color.Color { v:=uint8(x^y); return color.RGBA{v,v,255,255} }
..
m := Image{256,256}
pic.ShowImage(m)
のようにレシーバがポインタ版でなく値版にしても動く。
元は
type Image struct{}
func main() {
m := Image{}
pic.ShowImage(m)
}
を書き換えて実装しましょう、という問題なのでコレはハマった。
なんでエラーになるかわからん
GoCon行ってきた More ログイン