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章あたりに載っていたような気がします。(図書館で借りて読んだので今は手元にないので確認できません)

基礎からわかる Go言語

基礎からわかる Go言語

関数のオーバーロード

関数のオーバーロードもできません。

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

今年1年間の振り返り

こちらについてはみんなで話し合った内容を+TakashiYokoyama氏が自身のサイトにまとめてくださっているのでそちらを参照していただきたいと思います。


T.Yokoyamaのブログ: Golang Cafe #8を開催しました。

次回は

次回のGolang Cafeは私が次にやろうと思っていたことをやるみたいです。ただ私は参加できるかどうか分からないので、自分でもくもくしようかと思います。