適当な機能を作る途中に覚えたことのメモ書き。
今回はエラー作成とループ、ソート、配列処理について。
エラーを作る
基本的に何かを使うたびエラー判定してる気がする。
エラーは汎用関数の横流しが多いけど、自分で判定して作成も簡単にできる。
1 2 3 4 5 6 7 |
import "errors" func test(str string)(string,error){ if str == "" { return "", errors.New("some error") } return str, fmt.Errorf("no error %s",str) } |
ループ処理
goではfor
文しかないけれど、range
を使ってforeach
のようなことができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package main import ( "fmt" ) func main(){ arr := []int{3,1,4,1,5} for i:=0; i<len(arr); i++ { fmt.Printf("[%d]=%d\n", i, arr[i]) } fmt.Println() for i, v := range arr { fmt.Printf("[%d]=%d\n", i, v) } } |
マップの場合は順序が保証されず実行するごとに変わる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
m := map[int]int{ 1:3, 2:1, 3:4, 4:1, 5:5, } fmt.Println(m) for i, v := range m { fmt.Printf("[%d]=%d\n", i, v) } /* map[4:1 5:5 1:3 2:1 3:4] [5]=5 [1]=3 [2]=1 [3]=4 [4]=1 */ |
他言語でも同じですがjsだとfor in
とかで意識しなくてもキーでソートされてたので勘違いしてました。そもそもmapで順序が必要なのは設計ミス。
どうしてもという時はキー配列を作ってソートして順番通りにすることもできる。
1 2 3 4 5 6 7 8 9 10 |
import "sort" ... var keys []int for k := range m { keys = append(keys, k) } sort.Ints(keys) for _, k := range keys { fmt.Printf("[%d]=%d\n", k, m[k]) } |
この_
は使わない返値(インデックス)がエラーにならないように値を捨てている。
ソート
昇順ソートと降順ソート。
import "sort"
が必要。
1 2 3 4 5 6 7 8 |
//昇順ソートは用意されているので簡単 sort.Strings(keys) //内部的にはこれと同じ sort.Sort(sort.StringSlice(keys)) //逆順ソートはReverseを挟む sort.Sort(sort.Reverse(sort.StringSlice(keys))) |
配列処理(filterなど)
JSで多用する配列の便利機能(filter,map,reduce)はどれもないので愚直に書く必要がある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package main import "fmt" func main(){ ms := []map[string]string{ map[string]string{"ID":"1A","STAT":"Bad"}, map[string]string{"ID":"1B","STAT":"Nice"}, map[string]string{"ID":"2A","STAT":"Good"}, map[string]string{"ID":"2B","STAT":"Bad"}, } //[map[ID:1A STAT:Bad] map[ID:1B STAT:Nice] map[ID:2A STAT:Good] map[ID:2B STAT:Cool]] fmt.Println(ms) //配列を走査して新規配列を追加 findArr := []map[string]string{} for _,v := range ms { if(v["ID"]=="2A"){ findArr = append(findArr, v) } } //エラーハンドル if findArr == nil { fmt.Println("not found") return } //[map[ID:2A STAT:Good]] fmt.Println(findArr) findArr = []map[string]string{} for _,v := range ms { if(v["STAT"]=="Bad"){ findArr = append(findArr, v) } } //[map[ID:1A STAT:Bad] map[STAT:Bad ID:2B]] fmt.Println(findArr) } |
1 2 3 4 5 6 |
mapArr := []string{} for _,v := range ms { mapArr = append(mapArr, v["ID"]) } //[1A 1B 2A 2B] fmt.Println(mapArr) |
1 2 3 4 |
sum := 0 for _,v := range numsArr { sum += v["Price"] } |