回答編集履歴

3

2. の説明を追記

2018/03/12 02:06

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -51,6 +51,68 @@
51
51
  これけっこう説明ややこしいですね。あとで書き直します。
52
52
 
53
53
 
54
+
55
+ [https://play.golang.org/p/veZLmIk1kGT](https://play.golang.org/p/veZLmIk1kGT)
56
+
57
+ ```go
58
+
59
+ func shift(ls []int) int {
60
+
61
+ x := ls[0]
62
+
63
+ ls = append(ls[:0], ls[1:]...)
64
+
65
+ fmt.Printf("ls: %[1]v(%[1]p)\n", ls)
66
+
67
+ return x
68
+
69
+ }
70
+
71
+ func main() {
72
+
73
+ s := []int{1, 2, 3}
74
+
75
+ x := shift(s)
76
+
77
+ fmt.Printf("s: %[1]v(%[1]p)\n", s)
78
+
79
+ fmt.Println("x:",x)
80
+
81
+ }
82
+
83
+ ```
84
+
85
+
86
+
87
+ 詳しくは・・・のページを読んだあとで、
88
+
89
+ 上記ようにポインタアドレスを表示するようにすると見えてくるかもしれません。
90
+
91
+ xとlsの配列へのポインタは同じ値です。
92
+
93
+
94
+
95
+ ```go
96
+
97
+ ls = append(ls[:0], ls[1:]...)
98
+
99
+ ```
100
+
101
+ この時何が行われているのかというと、
102
+
103
+ * (元配列は[1 2 3])
104
+
105
+ * lsの配列ポインタの先にls[1:]の内容をコピーする
106
+
107
+ * (元配列は[2 3 3] に変更される)
108
+
109
+ * lsというスライスは元配列の先頭から長さ2のスライスになる
110
+
111
+ * このlsを表示すると「[]int{2 3}」
112
+
113
+ * shit関数呼び出し元のsというスライスは変更されないので元配列を指す長さ3のスライスのまま
114
+
115
+ * このsを表示すると「[]int{2 3 3}」となる
54
116
 
55
117
 
56
118
 

2

回答ミスありました。

2018/03/12 02:06

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -46,7 +46,11 @@
46
46
 
47
47
 
48
48
 
49
- appendではスライス値の再代入を行っているのでちゃんとスライス構造の変化が反映されます。
49
+ ~~appendではスライス値の再代入を行っているのでちゃんとスライス構造の変化が反映されます。~~
50
+
51
+ これけっこう説明ややこしいですね。あとで書き直します。
52
+
53
+
50
54
 
51
55
 
52
56
 

1

indent fix

2018/03/12 01:50

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -94,7 +94,7 @@
94
94
 
95
95
  res := (*in)[0]
96
96
 
97
- *in = (*in)[1:]
97
+ *in = (*in)[1:]
98
98
 
99
99
  return res
100
100