読者です 読者をやめる 読者になる 読者になる

don-bra.co

さいきんはphpとたわむれてます

A Tour of Go のつづき

Mapのexerciseをやってみました。
ArrayとSliceとごっちゃになっていたので、下のスライドと記事を見て勉強しました。

www.slideshare.net

dibtp.hateblo.jp

ざっくりの理解ですがArrayは長さと要素をもった型で、Sliceはもっと柔軟らしいです。
GopherならArrayよりもSlice使うらしい。 ArrayよりもSliceだよ!

Sliceの特徴としてはSliceを別の変数に代入すると参照渡しになるために下のようなことができます。

package main

import "fmt"

func main() {
    s1 := make([]int, 4)
    s1[0] = 30
    s1[1] = 20
    s1[2] = 4
 
    fmt.Println(s1)  // [30, 20, 4, 0]
 
    s2 := s1
 
    s2[0] = 25
    s2[3] = 80
 
    fmt.Println(s1)  // [25, 20, 4, 80]
    fmt.Println(s2)  // [25, 20, 4, 80]
 
}

s1[3]は始めデフォルト値0が入っているけれども s2にs1を代入して

s2[0] = 25
s2[3] = 80

してるのでそれぞれ25と80に変わります。 怪しい表現とか間違ってたら訂正してください!!

Mapはrubyでよく使っていたのでなんとなくわかる。 下のExcersiceをやってみました。

A Tour of Go

書いたコードはこちらです。

package main

import (
    "golang.org/x/tour/wc"
    "strings"
)

func WordCount(s string) map[string]int {
    m := make(map[string]int)
 
    sliced := strings.Fields(s)
    for i := 0; i < len(sliced); i++ {
        str := sliced[i]
        num, ok := m[str]
        if ok {
            m[str] = num + 1
        } else {
            m[str] = 1
        }
    }
    return m
}

func main() {
    wc.Test(WordCount)
}

うーん、if文らへんがもっとスマートに書けそうなきがするんですが、とりあえず動いてそうなので許してください。

静的型付けならではの書き方に慣れていきたいですねー