-
Notifications
You must be signed in to change notification settings - Fork 0
/
array_basic.go
123 lines (93 loc) · 3.19 KB
/
array_basic.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package array
import (
"strconv"
"strings"
"github.com/devlights/gomy/output"
)
// Basic は、Goにおける配列の基本的な使い方についてのサンプルです.
//
// REFERENCES:
// - https://dave.cheney.net/2018/07/12/slices-from-the-ground-up
func Basic() error {
// サイズが固定化されているものが配列
// スライスは配列の一部分を指し示す参照
var array1 [3]int
// 配列の要素数は len() で取得できる
output.Stdoutl("len(array1)", len(array1))
// 値はデフォルト値で初期設定される (この配列は int なので 0 で埋まる)
printArray("ary (1)", &array1)
// 値の設定
array1[1] = 100
printArray("ary (2)", &array1)
// 初期化と同時に宣言して設定することも可能
array2 := [...]int{1, 2, 3}
printArray("ary (3)", &array2)
// そのまま渡すと値のコピーが発生する
updateArrayVal(array2) // => 値のコピーが発生するので、値が変わらない
printArray("ary (4)", &array2)
updateArrayPtr(&array2) // => ポインタ経由させるので値が変わる
printArray("ary (5)", &array2)
// スライスは配列の一部分を指し示す参照
// 全体を指し示すスライスは以下のようにして取得できる
slice1 := array2[:]
// スライスを型情報出力してみると []int のように []の中に要素数が表示されない
output.Stdoutf("type", "array: %T, slice: %T\n", array2, slice1)
updateSliceVal(slice1) // => 参照なのでそのまま渡しても値が変わる (C# や Java などのリストと同じ)
printSlice("sli (1)", &slice1)
printArray("ary (6)", &array2) // => 元の配列も当然変わる
array3 := [...]int{1, 2, 4}
slice2 := array3[:]
updateSlicePtr(&slice2) // => ポインタで渡しても同じことになる。ただし関数の中でポインタから実体に戻す必要がある
printSlice("sli (2)", &slice2)
printArray("ary (7)", &array3) // => 元の配列も当然変わる
return nil
/*
$ task
task: Task "build" is up to date
task: [run] ./try-golang -onetime
ENTER EXAMPLE NAME: array_basic_usage
[Name] "array_basic_usage"
len(array1) 3
ary (1) 0 0 0
ary (2) 0 100 0
ary (3) 1 2 3
ary (4) 1 2 3
ary (5) 1 999 3
type array: [3]int, slice: []int
sli (1) 1 998 3
ary (6) 1 998 3
sli (2) 1 997 4
ary (7) 1 997 4
[Elapsed] 97.009µs
*/
}
func printArray(prefix string, ary *[3]int) {
sb := strings.Builder{}
for _, item := range ary {
s := strconv.Itoa(item)
_, _ = sb.WriteString(s)
_, _ = sb.WriteString(" ")
}
output.Stdoutl(prefix, sb.String())
}
func printSlice(prefix string, slice *[]int) {
sb := strings.Builder{}
for _, item := range *slice {
s := strconv.Itoa(item)
_, _ = sb.WriteString(s)
_, _ = sb.WriteString(" ")
}
output.Stdoutl(prefix, sb.String())
}
func updateArrayVal(ary [3]int) {
ary[1] = 999
}
func updateArrayPtr(ary *[3]int) {
ary[1] = 999
}
func updateSliceVal(slice []int) {
slice[1] = 998
}
func updateSlicePtr(slice *[]int) {
(*slice)[1] = 997
}