Lapis Lazuli

technical blog for web developer

【Go】配列を検索する

GoではPHPのin_arrayみたいな一発で配列にあるかどうか判別する関数は存在しません。
なので普通に書いて実装していくことになります。

list := []int{0, 1, 2, 3}
target := 1

for _, v := range list {
      if v == target {
            //一致したときの処理
      }
}

単純にfor~rangeで取り出して、ifで判定するという原始的な処理ですw
とはいえ、他の関数も内部的には配列の検索を行っていると思うし、そもそもGoはこれくらいの処理なら早いので問題はないかなと。
記述量が増えるというのはありますが、それはGoの他の箇所にも言える事なので、特別これだけの問題ではありません。
何度も呼び出すのなら、もうこれを関数化して呼び出すしかないですね。
そもそもforは十分に早いので、特に気にする事はありません。
ただrangeの注意点としては、渡される値がコピーなので、値を変更しても元のlistには反映されません。
やるならforで要素にアクセスするしかないかなと。

sliceとarrayの速度差

あまりGoでは使う事が少ないarrayですが、基本的に同じサイズなら差はありません。
が、arrayの場合、コピーすると値渡しになります。
そもそも巨大なarrayを作る事はないと思いますし(サイズが固定なので使いにくい)
Goはsliceメインなので困る事はないと思います。
ただsliceのappendは要素が多い場合時間がかかります。

普段使う機会が多いsliceの検索ですが、実は深い仕組みになっていたりするんですね。