回答編集履歴
3
2. の説明を追記
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
回答ミスありました。
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
answer
CHANGED
@@ -46,7 +46,7 @@
|
|
46
46
|
```sh
|
47
47
|
func shift(in *[]int) int {
|
48
48
|
res := (*in)[0]
|
49
|
-
|
49
|
+
*in = (*in)[1:]
|
50
50
|
return res
|
51
51
|
}
|
52
52
|
func main() {
|