Go
tips
文字列
効率化

Go 効率よくなるTips

bytesパッケージ、文字列の連結が早くなる

import (
    "bytes"
)

func StringBuild_good() string {
    var buffer bytes.Buffer
    for i := 0; i < 1000; i++ {
        buffer.WriteString("a")
    }
    return buffer.String()
}

mapの特性を利用する

sliceの中で探す時にmapを使うと、スピードが早くなる

// 重複した要素を削除して返却
func removeDuplicate1(args []string) []string {
    results := make([]string, 0, len(args))
    encountered := map[string]bool{}
    for i := 0; i < len(args); i++ {
        if !encountered[args[i]] {
            encountered[args[i]] = true
            results = append(results, args[i])
        }
    }
    return results
}

number format

'%d' % 100      # '100'
'%8d' % 100     # '     100'
'%-8d' % 100    # '100     '
'%08d' % 100    # '00000100'
'%08d' % -100   # '-0000100'
'%.8d' % 100    # '00000100'
'%10.8d' % 100  # '  00000100'
'%-10.8d' % 100 # '00000100  '

range罠

words := []string{"hoge", "fuga", "foo", "bar"}
//1.
for word := range words {
    fmt.Println(word)
}

//2.
for _,word := range words {
    fmt.Println(word)
}


#1.結果
0
1
2
3

#2.結果
hoge
fuga
foo
bar

slice処理tip,『 : 』を効率よく使う

//末尾の要素
v := slice[len(slice)-1]
// 末尾削除
slice = slice[:len(slice)-1]


//先頭の要素 
v:= slice[0]
slice = slice[1:]

pos := 追加する位置
// slice , slice[pos] = append(slice[:pos+1], slice[pos:]...), 追加する要素
slice = append(slice[:pos+1], slice[pos:]...)
slice[pos] = 追加する要素

jsonデータの扱い:

Goでの基本的なJSONデコード処理の書き方は

1.構造体を定義する
2.ファイルやWebAPI等からJSON文字列を取得する
3.json.UnmarshalでJSON文字列をデコードし、結果を構造体変数に放り込む
4.構造体変数のデータを処理をする

となります。

そもそもjson.Unmarshalのデコード結果はinterfaceで返ってくるので、構造体の定義は必須ではないのですが、GoでJSONを扱う上では使った方がよいです。
https://qiita.com/nayuneko/items/2ec20ba69804e8bf7ca3

interfaceからデータを取り出す方法


//JSONデコード
var decode_data interface{}
if err := json.Unmarshal(bytes, &decode_data); err != nil {
    log.Fatal(err)
}
// 表示
for _, data := range decode_data.([]interface{}) {
    var d = data.(map[string]interface{})
    fmt.Printf("%d : %s\n", int(d["id"].(float64)), d["name"])
}