「Go/配列とスライス」の版間の差分
編集の要約なし |
Semi-Brace (トーク | 投稿記録) 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]