1. ホーム
  2. スクリプト・コラム
  3. ゴラン

Goの配列とスライスの詳細な紹介

2022-02-14 18:03:25

I. 配列

配列は、複数の値を保持できる、同じ型の要素の集まりで、メモリに連続して格納されます

Goでは異なる型の要素を混ぜることはできず、定義段階で決定される配列のサイズも変更することはできません

1. 配列の定義

// Define an array of type string and type int8 of size 3, which can hold 3 strings and 3 numbers
var names [3]string
var ages [3]int8
fmt.Println(names, ages) // Output: [ ] [0 0 0]



2. 配列の割り当て

var ages [3]int8
ages[0] = 18
ages[2] = 22

fmt.Println(ages)
fmt.Println(ages[1])

// Output
[18 0 22]
0


3. 定義と初期化

// Way one.
var ages [3]int = [3]int{1, 2, 3}
fmt.Println(ages) // Output: [1 2 3]

// Way two.
var ages = [3]int{1, 2, 3}
fmt.Println(ages) // Output: [1 2 3]

// Way 3: ... The size of the array is the number of values placed after it
var ages = [...] int{1, 2, 3, 4, 5, 6, 7, 8}
fmt.Println(ages) // Output: [1 2 3 4 5 6 7 8]

// Mode 4.
ages := [...] int{1, 2, 3, 4, 8}
fmt.Println(ages) // Output: [1 2 3 4 8]


4. 配列のサイズは型の一部である

var a [2]int = [2]int{1, 2}
var b [2]int = [2]int{1, 3}

b = a // if not of the same type, mutual assignment is not allowed
fmt.Println(b)


5. 配列は値型

配列は値型であるため、Go関数のパラメータは copy 値型であれば、関数内で変更しても、元の

var a = [2]int{1, 2}
fmt.Println(a) // [1 2]
test(a) // [99 2]
fmt.Println(a) // [1 2]


func test(a [2] int) {
 a[0] = 99
 fmt.Println(a)
}


6. 配列長 len() 配列長は定義段階で固定されます。

var a = [2]int{1, 2} 
fmt.Println(len(a)) // Output: 2



7. 配列ループ

// Normal loop
var a = [...] int{7, 6, 5, 4, 3, 2, 1}
for i := 0; i < len(a); i++ {
   fmt.Println(a[i])
}


// loop through range (range is not a built-in function, it's a keyword like: for, if, else)
// If received in one variable, the value is the iterable index
// if received with two variables, one is the index and one is the specific value
var a = [...] int{7, 6, 5, 4, 3, 2, 1}
for i, value := range a {
    fmt.Println(i) // index
    fmt.Println(value) // value
}

// don't index just print the value loop
for _, value := range a {
 fmt.Println(value)
}



8. 多次元配列

var a [3][3]int // define
a[0][1] = 20 // use
fmt.Println(a) // Output: [[0 20 0] [0 0 0] [0 0 0]]


// Define and assign initial values
var a [3][3]int = [3][3]int{{1}, {2, 3, 4}, {5, 6}}
fmt.Println(a) // Output: [[1 0 0] [2 3 4] [5 6 0]]


// Loop through a multi-dimensional array
var a [3][3]int = [3][3]int{{1}, {2, 3, 4}, {5, 6}}
for _, value := range a {
   for _, inValue := range value {
      fmt.Println(inValue)
   }
}


9. 配列の定義と位置の指定 初期化

// Specify initialization values at indexes 5 and 7
var ages [10]int = [10]int{5: 55, 7: 77}
fmt.Println(ages) // Output: [0 0 0 0 0 0 55 0 77 0 0 0]



II. スライシングの基本

スライシングは、配列から構築されたスキームで、柔軟かつ強力なラッパーです ( Wrapper ).

データそのものは持たず、既存の配列への参照のみとなります。

1. スライスの定義

// Define an array
var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
// Based on the array, make a slice
b := a[:]

fmt.Println(b) // output: [9 8 7 6 5 4 3 2 1 0]
fmt.Printf("%T", b) // output: []int without the stuff in the brackets, which is the slice type

fmt.Println(a) // output: [9 8 7 6 5 4 3 2 1 0]
fmt.Printf("%T", a) // Output: [10]int


2. スライスの使用

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
b := a[:]

fmt.Println(b[0]) // Output: 9
fmt.Println(b[2]) // Output: 7


3. スライスの変更は配列に影響する

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
b := a[:]
b[0] = 99 // modify the slice

fmt.Println(b) // Output: [99 8 7 6 5 4 3 2 1 0]
// The array will be modified
fmt.Println(a) // Output: [99 8 7 6 5 4 3 2 1 0]


4. 配列の変更はスライシングにも影響する

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
b := a[:]
a[1] = 99 // Modify the array

fmt.Println(a) // Output: [9 99 7 6 5 4 3 2 1 0]
// The slice is also modified
fmt.Println(b) // Output: [9 99 7 6 5 4 3 2 1 0]


5. 配列の一部分のみをスライスする

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
b := a[3:6]

// Modify the slice
b[0] = 66
fmt.Println(b) // Output: [66 5 4]
fmt.Println(a) // Output: [9 8 7 66 5 4 3 2 1 0]

// Modify the array
a[4] = 55
fmt.Println(b) // output: [66 55 4]
fmt.Println(a) // Output: [9 8 7 66 55 4 3 2 1 0]


6. 複数のスライスが同じ基礎となる配列を共有する場合、各スライスで行われた変更は配列に反映される

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
b := a[3:5]
c := a[4:6]
fmt.Println(a) // Output: [9 8 7 6 5 4 3 2 1 0]
fmt.Println(b) // Output: [6 5]
fmt.Println(c) // Output: [5 4]
b[1] = 555
fmt.Println(a) // Output: [9 8 7 6 555 4 3 2 1 0]
fmt.Println(b) // Output: [6 555]
fmt.Println(c) // Output: [555 4]



7. スライス長・容量

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
b := a[3:7]

fmt.Println(b) // output: [6 5 4 3]
fmt.Println(a) // Output: [9 8 7 6 5 4 3 2 1 0]

// Slice length
fmt.Println(len(b)) // Output: 4
// slice capacity (the maximum number of values I can store, all from the start of the slice backwards, starting at index 3)
fmt.Println(cap(b)) // Output: 7



8. スライスの追加値

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
b := a[6:8]

b = append(b,11)
b = append(b,22)
fmt.Println(a) // Output: [9 8 7 6 5 4 3 2 11 22]

// append to the critical point in the append
b = append(b,33)
b = append(b,44)
fmt.Println(a) // Output: [9 8 7 6 5 4 3 2 11 22]
fmt.Println(b) // Output: [3 2 11 22 33 44]

// The length of the array will not change, he will double the original, copy my original value to my new array a and b are no longer related
b[0] = 33
fmt.Println(b) // output: [33 2 11 22 33 44]
fmt.Println(a) // Output: [9 8 7 6 5 4 3 2 11 22]


Go言語の配列とスライスについての記事は以上となります。Go言語の配列とスライスについてのより詳しい情報は、過去の記事を検索するか、以下の記事を引き続きご覧ください。