Golang Cafe #8 まとめ プレGo年会ほか
2013/12/15に開催された「Golang Cafe #8」についてのまとめです。
今回も私が気になった点を質問させていただいた後、今年1年間の振り返りをしました。(Golang Cafeが始まったのは2013/10/27(日)からですが)
私が質問したこと
関数の引数としての配列とスライスの違い
そもそもはGoogle+でPHPが糞言語なのはどう考えても参照をポインタだと思っているお前らが悪い - なんたらノート第三期ベータなリンクがあったので改めて気になったので確認しました。
Go言語では基本的にはC言語と同じということらしい、つまりポインタならポインタと明示的に示さなくてはならないらしい。
ただ気をつけておきたいのは関数に配列(スライス)を渡すときのようです。
package main import "fmt" func main() { array := [5]int{1, 2, 3, 4, 5} fa(array) fmt.Printf("array: %v\n", array) slice := array[:] fs(slice) fmt.Printf("array: %v\n", array) fmt.Printf("slice: %v\n", slice) } func fa(arr [5]int) { for i, _ := range arr { arr[i] *= 10 } } func fs(slc []int) { for i, _ := range slc { slc[i] *= 1000 } }
array: [1 2 3 4 5] array: [1000 2000 3000 4000 5000] slice: [1000 2000 3000 4000 5000]
この結果のように配列として関数の渡した場合は配列のコピーが渡されるようです。つまり関数を呼び出す際に余分なオーバヘッドがあるということですね。
上記の内容をみると関数に配列をそのまま渡すことはなさそうですが、配列をそのまま渡す際に気をつけておきたいことがあるようです。
package main import "fmt" func main() { arr := [5]int{1, 2, 3, 4, 5} f1(arr) } func f1(arr [10]int) { fmt.Println(arr) }
# command-line-arguments .\sample02.go:8: cannot use arr (type [5]int) as type [10]int in function argument
このように[5]intと[10]intは別のものとして扱われるようです。上のサンプルのようにコピーが渡されるので配列のサイズが異なっていたら困るので当然ということなのでしょうか。
そういえば先日写経したこちらの本の第6章あたりに載っていたような気がします。(図書館で借りて読んだので今は手元にないので確認できません)
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- クリック: 7回
- この商品を含むブログ (10件) を見る
関数のオーバーロード
関数のオーバーロードもできません。
package main import "fmt" func main() { v1, v2 := 1, "2" f1(v1) f1(v2) } func f1(v string) { fmt.Println(v) } func f1(v int) { fmt.Println(v) }
# command-line-arguments .\sample03.go:11: cannot use v2 (type string) as type int in function argument .\sample03.go:18: f1 redeclared in this block previous declaration at .\sample03.go:14
次回は
次回のGolang Cafeは私が次にやろうと思っていたことをやるみたいです。ただ私は参加できるかどうか分からないので、自分でもくもくしようかと思います。