サーチ…
前書き
配列は、別の型の要素の順序付けられたコレクションを表す特定のデータ型です。
Goでは、配列は単純なもの(リストとも呼ばれることもある)や多次元配列(例えば2次元の配列は要素を含む順序付けされた配列の集合を表す)
構文
- var variableName [5] ArrayType //サイズが5の配列を宣言します。
- var variableName [2] [3] ArrayType = {{値1、値2、値3}、値4、値5、値6}} //多次元配列を宣言する
- variableName:= [...] ArrayType {Value1、Value2、Value3} //サイズ3の配列を宣言します(コンパイラは配列要素を数えてサイズを定義します)
- arrayName [2] //インデックスで値を取得します。
- arrayName [5] = 0 //インデックスに値を設定します。
- arrayName [0] //配列の最初の値
- arrayName [len(arrayName)-1] //配列の最後の値
配列の作成
goの配列は、同じ型の要素の順序付けられたコレクションです。
配列を表すための基本的な表記法は、変数名に[]
を使用することです。
新しいアレイを作成するように見えるvar array = [size]Type
、置換size
数で(例えば、 42
が42個の要素のリストであろう指定する)、および交換Type
のために(配列缶含有元素の種類によって例int
またはstring
)
そのすぐ下に、Goに配列を作成するさまざまな方法を示すコード例があります。
// Creating arrays of 6 elements of type int,
// and put elements 1, 2, 3, 4, 5 and 6 inside it, in this exact order:
var array1 [6]int = [6]int {1, 2, 3, 4, 5, 6} // classical way
var array2 = [6]int {1, 2, 3, 4, 5, 6} // a less verbose way
var array3 = [...]int {1, 2, 3, 4, 5, 6} // the compiler will count the array elements by itself
fmt.Println("array1:", array1) // > [1 2 3 4 5 6]
fmt.Println("array2:", array2) // > [1 2 3 4 5 6]
fmt.Println("array3:", array3) // > [1 2 3 4 5 6]
// Creating arrays with default values inside:
zeros := [8]int{} // Create a list of 8 int filled with 0
ptrs := [8]*int{} // a list of int pointers, filled with 8 nil references ( <nil> )
emptystr := [8]string{} // a list of string filled with 8 times ""
fmt.Println("zeroes:", zeros) // > [0 0 0 0 0 0 0 0]
fmt.Println("ptrs:", ptrs) // > [<nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil>]
fmt.Println("emptystr:", emptystr) // > [ ]
// values are empty strings, separated by spaces,
// so we can just see separating spaces
// Arrays are also working with a personalized type
type Data struct {
Number int
Text string
}
// Creating an array with 8 'Data' elements
// All the 8 elements will be like {0, ""} (Number = 0, Text = "")
structs := [8]Data{}
fmt.Println("structs:", structs) // > [{0 } {0 } {0 } {0 } {0 } {0 } {0 } {0 }]
// prints {0 } because Number are 0 and Text are empty; separated by a space
多次元配列
多次元配列は、基本的に他の配列を要素として含む配列です。
それは同様に表される[sizeDim1][sizeDim2]..[sizeLastDim]type
、置換sizeDim
DIMENTIONの長さに対応する番号をtype
多次元配列のデータの種類によって。
たとえば、 [2][3]int
は、 3つのint型付き要素の 2つのサブ配列で構成される配列を表します 。
基本的には、 2行 3列の行列を表現することができます 。
たとえば、0年目以降の分ごとに数値を格納する必要がある場合は、 var values := [2017][12][31][24][60]int
ような巨大次元の数値配列を作成できます。
この種の配列にアクセスするには、最後の例では19:42に2016-01-31の値を検索すると、 values[2016][0][30][19][42]
アクセスしvalues[2016][0][30][19][42]
( 配列インデックス0から始まり、 1日と数ヶ月のようなものではない)
次のいくつかの例:
// Defining a 2d Array to represent a matrix like
// 1 2 3 So with 2 lines and 3 columns;
// 4 5 6
var multiDimArray := [2/*lines*/][3/*columns*/]int{ [3]int{1, 2, 3}, [3]int{4, 5, 6} }
// That can be simplified like this:
var simplified := [2][3]int{{1, 2, 3}, {4, 5, 6}}
// What does it looks like ?
fmt.Println(multiDimArray)
// > [[1 2 3] [4 5 6]]
fmt.Println(multiDimArray[0])
// > [1 2 3] (first line of the array)
fmt.Println(multiDimArray[0][1])
// > 2 (cell of line 0 (the first one), column 1 (the 2nd one))
// We can also define array with as much dimensions as we need
// here, initialized with all zeros
var multiDimArray := [2][4][3][2]string{}
fmt.Println(multiDimArray);
// Yeah, many dimensions stores many data
// > [[[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]]
// [[[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]]
// We can set some values in the array's cells
multiDimArray[0][0][0][0] := "All zero indexes" // Setting the first value
multiDimArray[1][3][2][1] := "All indexes to max" // Setting the value at extreme location
fmt.Println(multiDimArray);
// If we could see in 4 dimensions, maybe we could see the result as a simple format
// > [[[["All zero indexes" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]]
// [[[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" ""]]]
// [[["" ""] ["" ""]] [["" ""] ["" ""]] [["" ""] ["" "All indexes to max"]]]]
配列インデックス
配列値は、配列内の目的の値の位置を指定する数値を使用してアクセスする必要があります。この番号はインデックスと呼ばれます。
インデックスは0から始まり、 配列の長さ-1で終了します。
値にアクセスするには、 arrayName[index]
ように、配列内の値のランクに対応する数値で "index"を置き換える必要があります。
例えば:
var array = [6]int {1, 2, 3, 4, 5, 6}
fmt.Println(array[-42]) // invalid array index -1 (index must be non-negative)
fmt.Println(array[-1]) // invalid array index -1 (index must be non-negative)
fmt.Println(array[0]) // > 1
fmt.Println(array[1]) // > 2
fmt.Println(array[2]) // > 3
fmt.Println(array[3]) // > 4
fmt.Println(array[4]) // > 5
fmt.Println(array[5]) // > 6
fmt.Println(array[6]) // invalid array index 6 (out of bounds for 6-element array)
fmt.Println(array[42]) // invalid array index 42 (out of bounds for 6-element array)
配列の値を設定または変更する方法は同じです。
例:
var array = [6]int {1, 2, 3, 4, 5, 6}
fmt.Println(array) // > [1 2 3 4 5 6]
array[0] := 6
fmt.Println(array) // > [6 2 3 4 5 6]
array[1] := 5
fmt.Println(array) // > [6 5 3 4 5 6]
array[2] := 4
fmt.Println(array) // > [6 5 4 4 5 6]
array[3] := 3
fmt.Println(array) // > [6 5 4 3 5 6]
array[4] := 2
fmt.Println(array) // > [6 5 4 3 2 6]
array[5] := 1
fmt.Println(array) // > [6 5 4 3 2 1]