teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

2. の説明を追記

2018/03/12 02:06

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -25,7 +25,38 @@
25
25
  ~~appendではスライス値の再代入を行っているのでちゃんとスライス構造の変化が反映されます。~~
26
26
  これけっこう説明ややこしいですね。あとで書き直します。
27
27
 
28
+ [https://play.golang.org/p/veZLmIk1kGT](https://play.golang.org/p/veZLmIk1kGT)
29
+ ```go
30
+ func shift(ls []int) int {
31
+ x := ls[0]
32
+ ls = append(ls[:0], ls[1:]...)
33
+ fmt.Printf("ls: %[1]v(%[1]p)\n", ls)
34
+ return x
35
+ }
36
+ func main() {
37
+ s := []int{1, 2, 3}
38
+ x := shift(s)
39
+ fmt.Printf("s: %[1]v(%[1]p)\n", s)
40
+ fmt.Println("x:",x)
41
+ }
42
+ ```
28
43
 
44
+ 詳しくは・・・のページを読んだあとで、
45
+ 上記ようにポインタアドレスを表示するようにすると見えてくるかもしれません。
46
+ xとlsの配列へのポインタは同じ値です。
47
+
48
+ ```go
49
+ ls = append(ls[:0], ls[1:]...)
50
+ ```
51
+ この時何が行われているのかというと、
52
+ * (元配列は[1 2 3])
53
+ * lsの配列ポインタの先にls[1:]の内容をコピーする
54
+ * (元配列は[2 3 3] に変更される)
55
+ * lsというスライスは元配列の先頭から長さ2のスライスになる
56
+ * このlsを表示すると「[]int{2 3}」
57
+ * shit関数呼び出し元のsというスライスは変更されないので元配列を指す長さ3のスライスのまま
58
+ * このsを表示すると「[]int{2 3 3}」となる
59
+
29
60
  > 3.
30
61
 
31
62
  以下の形であれば動作すると思います。

2

回答ミスありました。

2018/03/12 02:06

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -22,8 +22,10 @@
22
22
 
23
23
  > 2.
24
24
 
25
- appendではスライス値の再代入を行っているのでちゃんとスライス構造の変化が反映されます。
25
+ ~~appendではスライス値の再代入を行っているのでちゃんとスライス構造の変化が反映されます。~~
26
+ これけっこう説明ややこしいですね。あとで書き直します。
26
27
 
28
+
27
29
  > 3.
28
30
 
29
31
  以下の形であれば動作すると思います。

1

indent fix

2018/03/12 01:50

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -46,7 +46,7 @@
46
46
  ```sh
47
47
  func shift(in *[]int) int {
48
48
  res := (*in)[0]
49
- *in = (*in)[1:]
49
+ *in = (*in)[1:]
50
50
  return res
51
51
  }
52
52
  func main() {