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言語の配列とスライスについてのより詳しい情報は、過去の記事を検索するか、以下の記事を引き続きご覧ください。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン