カサレリア。katzenです。
今回は、配列について紹介したいと思います。
基本
まずは基本から
初期化は[ ]
でくくり、,
カンマで区切ります。
参照は[<インデックス>]
で0スタートです。マイナスインデックスは使用出来ません。
iarr := [1,2,3]
println(iarr)
// [1,2,3]
println(iarr[1])
// 2
sarr := ["一","二","三"]
println(sarr)
// ['一', '二', '三']
追加
追加は<<
を使用します。
mut
をつけることに注意しましょう。
mut src := [1,2,3]
src << 4 // = は必要ありません。
println(src)
// [1,2,3,4]
src << [5,6,7] // 配列ごと追加できます。
println(src)
// [1,2,3,4,5,6,7]
存在チェック
existsみたいな感じですね。
<値> in <配列>
という様に書きます。
color := ['red','green','blue']
println('red' in color)
// true
println('yellow' in color)
// false
配列長
len
で取得できます。
l := [1,2,3]
println(l.len)
// 3
宣言と初期化
データはまだないけど、メモリは確保しておきたい場合や、初期値としてなにかを設定したい場合に使用します。
書き方はgolangに近いですね。
mut <変数> := []<型>{len:<値>,cap:<値>,init:<値>}
lenは配列長、capはメモリ長,initは初期値です。
mut ml := []int{len: 5,cap: 8,init: 2}
println(ml.len) // 5
println(ml.cap) // 8
println(ml)
// [2,2,2,2,2]
mut buff := []int{} // パラメータは省略も可能です。
println(buff.len) // 0
println(buff.cap) // 0
buff << 1
println(buff.len) // 1
println(buff.cap) // 2 2の倍数単位でメモリを確保する様子
it
特殊な予約語で、宣言時は0から1づつ加算した値を返します。
例を見てもらったほうがいいでしょう。
count := []int{len:5,init:it}
println(count)
// [0,1,2,3,4]
count2 := []int{len:5,init:it*it}
println(count2)
// [0,1,4,9,16]
filter
,map
,any
などでも出てきますが、その場合は格納している値を指す特殊な予約語です。
多次元配列
mut cross := [][]int{len:3,init:[]int{len:2,init:-1}}
println(cross)
// [[-1, -1], [-1, -1], [-1, -1]]
cross[1][1] = 9
println(cross)
// [[-1, -1], [-1, 9], [-1, -1]]
複製
配列など別の変数に代入した場合、言語によってはアドレスポインタのコピーですが、V言語ではまるっとコピーすることを期待します。
そのため、配列を別の変数に入れる場合、clone
を使用します。
mut src := [1,2,3]
// copy := src error
copy := src.clone()
src[1] *= 10
println(copy)
// [1,2,3]
条件による抽出
filter
を用いて条件にあった値を取得します。
base := [5,4,3,2,1]
even := base.filter(it % 2 == 0) //偶数だけ取得。
println(even)
// [4,2]
一律で値を処理する
map
を使用して格納している値全てを処理することが出来ます。
Scalaとか馴染みがあるかもしれませんね。
orig := [1,2,3]
next := orig.map(it*3)
println(next)
// [3,6,9]
条件一致
配列の値が条件に合致するか判定するメソッドがあります。
any
は配列の中身でどれか1つでも適合するかの判定に使います。
all
は配列の中身がすべて条件に適合するかの判定に使います。
box := [1,10,100]
println(box.any(it < 10)) // 10以下の値を含む true
println(box.all(it %2 == 0)) // すべて偶数 false
長くなってしまったので、今回はここで。
最後に、jsやphpと違い、配列要素に違う型を混ぜることは出来ないことをお伝えしたいと思います。
any := [1,2,"3"]
// invalid array element: expected `int`, not `string`