map [K] V //Kがkeyのtype、Vがvalueのtype
- Keyは==で比較する。
- floating-pointで==比較はしてはいけない。chapter3参照。
- 特にNaNとはダメ
- makeはsliceとmapを作れる
- 初期値を伴う宣言の場合はmakeはいらない。
// pattern 1
ages := make(map[string]int)
// pattern 2
ages := map[string]int{ // makeなし
"alice": 31,
"charlie": 34,
}
// pattern 3
ages := make(map[string]int)
ages["alice"] = 31
ages["charlie"] = 34
// empty map
ages := map[string]int{}
delete(ages, "alice")
- zero valueになる
- 本当に存在しなかったかどうかはフラグをチェック
val, ok := ages["hoge"]
if !ok {}
ages["hoge"] = ages["hoge"] + 1
ages["hoge"] += 1
ages["hoge"]++
- map elementのアドレスは得られない
- rehashでアドレスが変化するから
- &ages["alice"]はコンパイルエラー
- range-based for loopででkey,valueがとれる。
- しかし順番はランダム(rangeを実行する度に順番かわる)
for name,age := range ages {
}
- delete,len,range はnilなmapで安全.空のmapと同じように振る舞う
- しかし、makeでallocateする前に代入しようとするとpanicになる
- mapどうしの比較はできない
- 唯一 == nilだけ可能
- Goはset型を提供していない
- 重複する要素をもたない、順序づけられていない要素の集まり
- mapはkeyの重複がないことを利用して作成
- それを説明するためにdedupというプログラムを紹介
- 各行をreadしてprint、ただし重複した行コンテンツはprintしない。
- https://github.com/adonovan/gopl.io/blob/master/ch4/dedup/main.go
- (if err := input.Err(); err != nil っていつ発生するんだろ)
- ただしいつもmap[string]boolがシンプルなset型にはならないことに注意
- セット型がリストだから?単純にkeyをとりだしただけだと、falseのkeyも取得できてしまう
-
mapのkeyにsliceは使えるか?
- 使えない
- mapのkeyは比較可能でなければならない
- sliceは比較には使えない
-
sliceの内容を一つの文字列にして、mapのkeyとする
- slice以外でも応用できる
ages := map[string]int{
"alice": 31,
"charlie": 34,
}
ages2 := map[string]int{
"alice": 31,
"charlie": 34,
}
str := fmt.Sprintf("%q", ages)
str2 := fmt.Sprintf("%q", ages2)
fmt.Printf("%v", str == str2) // true
- inputのUnicode code pointをカウントする
- r, n, err := in.ReadRune() // returns rune, nbytes, error
- 読み込み失敗すると、変わりの文字(ReplacementChar=U+FFFD)がrに入る
if r == unicode.ReplacementChar && n == 1 {
https://github.com/adonovan/gopl.io/blob/master/ch4/graph/main.go