RubyにおけるArray#shiftと同様の関数を実装したい
素朴に以下のように書いたところ期待とは異なる挙動をしました。
shiftの実装
go
1func shift(ls []int) int { 2 x := ls[0] 3 ls = ls[1:] 4 return x 5}
実行結果
もとのスライスが変更されていませんでした。
go
1func main() { 2 ls := []int{1, 2, 3} 3 x := shift(ls) 4 fmt.Println(x, ls) 5}
sh
1$ go run main.go 21 [1 2 3]
また、こちらの質問を参考にappend
を使うようにしても思うような結果が得られませんでした。
appendを使った場合
go
1func shift(ls []int) int { 2 x := ls[0] 3 ls = append(ls[:0], ls[1:]...) 4 return x 5}
実行結果
もとのスライスの最後の要素が重複しているようでした。
sh
1$ go run main.go 21 [2 3 3]
質問
- 最初の実装ではなぜもとのスライスが変更されないのでしょうか?
append
を使った実装ではなぜ最後の要素が重複しているのでしょうか?- 期待する結果を得るにはどのように実装したらいいのでしょうか?
なお、以下のように関数を定義せずに同様のことができることは存じておりますので、この方向性でやるとしたらどのようにしたらよいかをお伺いしたいです。
go
1ls := []int{1,2,3} 2x := ls[0] 3ls = ls[1:]
環境
sh
1$ go version 2go version go1.10 linux/amd64
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/12 12:53 編集