Skip to content

第4回議事録

Yoshiki Shibata edited this page Mar 15, 2017 · 1 revision

概要

  • 日時 2017/03/11 13:00-17:00
  • 場所 横浜ブルーアベニュー 12F 会議室2
  • 開始 p.90 3.6.2 型付けなし定数
  • 終了 p.121 4.4.3 構造体埋め込みと無名フィールド
  • 次回日時 2017/4/8 13:00-17:00

参加者

柴田 加藤 吉川 神保 今井
                 井上
                 谷沢
浜野 高橋 相田 鈴木 長友

時間

  • 13:00-17:00 輪読
  • 14:46 黙祷

議論

要素数3の配列を要素数2の配列にキャストできるか?

p.93

size2 := [2]int{1, 2}
size3 := [3]int{1, 2, 0}
[2]int(size3)
[3]int(size2)

以下のエラーメッセージとともにコンパイルエラーとなった。

cannot convert size3 (type [3]int) to type [2]int
cannot convert size2 (type [2]int) to type [3]int

sliceを引数で渡した場合

p.96

sliceを引数で渡すとsliceはshallow copyされる。 つまり、len, capはコピーされ、dataは共有することになる。 そのため、以下のreverse関数は共有しているdataを変更しており、 呼び出し後には逆順になっている。

func reverse(s []int) {
    for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
        s[i], s[j] = s[j], s[i]
    }
}

sliceが自分自身を含むことを可能

p.98

sliceが自分自身を含むことを可能である。 つまり、同じdataを指すsliceを入れ子にすることが可能。

type S []S
var s = make(S, 1)
s[0] = s
fmt.Println(s)

ただし、このプログラムを実行するとスタックオーバーフローする。

runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

ちなみに、参照しなければスタックオーバーフローしない。

type S []S
var s = make(S, 1)
s[0] = s

何に使うのかは謎。

sliceとnil

p.98

sliceの場合、len(s)やrangeで回すことが多い。 そのため、関数の戻り値でsliceを返す場合、空スライスとして戻り値にnilを返すことは多い。 また、使用側はその前提でsliceを使用するべきである。

sliceのappend

p.99

sliceをappendすると、同じsliceが返ってくる保証がない。 例えば容量が足りない場合、新しいslice・新しい基底配列を生成して戻す。 そのため、必ずappendの戻り値で更新する必要がある。

s := make([]int, 0)
s = append(s, 1) // 必ずsに代入し直すこと

また、前もってappendする回数などが分かっている場合、 make()するタイミングで十分なcapacityを設定する。

Link

You can’t perform that action at this time.