「Go/配列とスライス」の版間の差分

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go
削除された内容 追加された内容
編集の要約なし
M added Category:Go using HotCat
273 行 273 行
tuika : [11 9 7 5 3 1 33 123]
tuika : [11 9 7 5 3 1 33 123]
</pre>
</pre>

[[カテゴリ:Go]]

2021年4月14日 (水) 09:14時点における版

配列とスライス

配列

Go言語では、配列を宣言するとき、

var 配列名 [要素数]型

で宣言します。

また、配列の宣言時に一括で数値を代入するとき、

= [要素数]配列名{0番目の値,1番目の値, ※ 以下略 } 

のように代入します。


なお配列は0番目から数えます。(Go言語にかぎらず、C言語などでも配列は0番目から数えます。)


コード例
// 型の変換

package main

import "fmt"

var hensu [3]int = [3]int{7,5,3};


func main() {
    fmt.Println("1kkome :", hensu[0])
    fmt.Println("2kkome :", hensu[1])
    fmt.Println("3kkome :", hensu[2])    
}
実行結果
1kkome : 7
2kkome : 5
3kkome : 3


配列の各要素の値にアクセスする場合、

fmt.Println("1kkome :", hensu[0])

の第2引数のように、

配列名[番号]

でアクセスします。この場合、配列名hensuの0番目にアクセス、という意味です。

また、このような配列の各要素のアクセスのときの [ ] 内の番号のことをインデックスといいます。(Go言語にかぎらずC言語などでも同様に「インデックス」という。)


つまり、配列のアクセスは

配列名[インデックス]

でアクセスとも、言い替えることができます。


さて、実は

var hensu[3] int = [3]int{7,5,3};

と書いたり、あるいは

var hensu[3]int = [3]int{7,5,3};

と続けて書いても、エラーにならず、動作できます。(Fedora32で2020年に確認。)


さて、

var hensu [3]int = [3]int{7,5,3};

のように、左辺の要素数と、右辺の要素数とは、同一でないとイケマセン。要素数を変えてみても、エラーになるだけです。


実は

var hensu[3]int = [3]int{7,5};

は動作します。

ただし、

fmt.Println("3kkome :", hensu[2])    

をmain関数から外す必要があります。

つまり、右辺の { } カッコ内の要素数が、左辺で宣言した要素数よりも少ないぶんには、可能です。


いっぽう、

var hensu[3]int = [2]int{7,5};

は、エラーになります。


var hensu[3]int = [4]int{7,5,3,1};

は、エラーになります。


スライス

スライス

Go言語では、配列とは別に、スライスという要素数を可変長にコード中で変更できる構造があります。

下記コードのaaaが可変長配列です。


配列をもとにスライスを作ることもできます。


たとえばhensuという配列のある場合、

下記コードの右辺の

aaa := hensu[1:4]

は hensuの1番目から4番目までを取り出して、新たな配列をつくる事を意味します。


コード例
package main

import "fmt"

var hensu[6]int = [6]int{11,9,7,5,3,1};


func main() {
    aaa := hensu[1:4] // {9,7,5}
    fmt.Println("kotae1 :", aaa)

    aaa = hensu[2:4] // {7,5}
    fmt.Println("kotae2 :", aaa)
    
}


表示の結果
kotae1 : [9 7 5]
kotae2 : [7 5]

上記の実行結果のように、スライスを使うことで、ひとつのaaaを、要素数を変えて使い回すことができます。


スライスを宣言したとき、そのスライスの要素数の最大限度が、要素の値および現在の要素数と一緒に登録されます。


スライスの数値を省略して [:] とすると、もとの配列の要素全部を1つのスライスにします。


コード例
package main

import "fmt"

var hensu[6]int = [6]int{11,9,7,5,3,1};


func main() {

    aaa := hensu[:]
    fmt.Println("kotae1 :", aaa)
    
}


表示の結果
kotae1 : [11 9 7 5 3 1]


スライスの各要素へのアクセス

スライスの各要素にアクセスするには、配列と同様に、

スライス名[インデックス]

でアクセスできます。


コード例
package main

import "fmt"

var hensu[6]int = [6]int{11,9,7,5,3,1};


func main() {
    aaa := hensu[1:4] // {9,7,5}
    fmt.Println("kotae1 :", aaa)

    aaa[1]=888
    fmt.Println("kakikae :", aaa)

}


表示の結果
kotae1 : [9 7 5]
kakikae : [9 888 5]


スライス [9 7 5] のインデックス番号1に相当する「値7」が、書き換えにより「888」に置き換わっています。


また、計算なども配列同様に可能です。


スライスの追加

スライスに要素を追加するには append 関数で可能です。末尾に追加されていきます。

append(追加される側のスライス, 追加内容)

もし追加内容が2個以上の場合は、

append(追加される側のスライス, 追加内容1,追加内容2,追加内容3)

のようにカンマ(,)で区切って記述していきます。


コード例
package main

import "fmt"

var hensu[6]int = [6]int{11,9,7,5,3,1};


func main() {

    aaa := hensu[:]
    fmt.Println("kotae1 :", aaa)

    bbb := append (aaa, -4,23)
    fmt.Println("tuika :", bbb)
}


表示の結果
kotae1 : [11 9 7 5 3 1]
tuika : [11 9 7 5 3 1 -4 23]


上記コードでは説明の単純化のため新規スライス bbb を作成しましたが、スライスaaaを使い回すことも可能です。


コード例
package main

import "fmt"

var hensu[6]int = [6]int{11,9,7,5,3,1};


func main() {

    aaa := hensu[:]
    fmt.Println("kotae1 :", aaa)

    aaa = append (aaa, 33,123)
    fmt.Println("tuika :", aaa)
}


表示の結果
kotae1 : [11 9 7 5 3 1]
tuika : [11 9 7 5 3 1 33 123]