2017-04-25 27 views
4

スライス内のある位置から別の位置にアイテムを移動しようとしています。移動中のある位置から別の位置にスライスアイテムを移動する

slice: [0 2 3 4 5 6 7 8 9] 
newSlice: [0 2 3 4 1] 
slice: [0 2 3 4 1 1 6 7 8 9] 

しかし、私は、出力は次のようになり期待:Go Playground

indexToRemove := 1 
indexWhereToInsert := 4 

slice := []int{0,1,2,3,4,5,6,7,8,9}  

slice = append(slice[:indexToRemove], slice[indexToRemove+1:]...) 
fmt.Println("slice:", slice)  

newSlice := append(slice[:indexWhereToInsert], 1) 
fmt.Println("newSlice:", newSlice) 

slice = append(newSlice, slice[indexWhereToInsert:]...) 
fmt.Println("slice:", slice) 

これは次の出力を生成し

slice: [0 2 3 4 5 6 7 8 9] 
newSlice: [0 2 3 4 1] 
slice: [0 2 3 4 1 **5** 6 7 8 9] 

どこに私のせいでしょうか?

+0

スライスは、配列(Flimzyの答え)を参照するオブジェクトです。また、実際にはベアアレイを外出先でも使用できることを覚えておいてください。ただし、スライスと比べてかなり扱いにくいものです。彼らは特定の状況で有用かもしれません。 – RayfenWindspear

答えて

2

問題は、newSlicesliceの別個のコピーではないということです。それらは同じ基本アレイを参照しています。

newSliceに割り当てると、基礎となる配列が変更されるため、sliceも変更されます。 Playground

package main 

import (
    "fmt" 
) 

func main() { 

    indexToRemove := 1 
    indexWhereToInsert := 4 

    slice := []int{0,1,2,3,4,5,6,7,8,9} 

    val := slice[indexToRemove] 

    slice = append(slice[:indexToRemove], slice[indexToRemove+1:]...) 
    fmt.Println("slice:", slice)  

    newSlice := make([]int, indexWhereToInsert+1) 
    copy(newSlice,slice[:indexWhereToInsert]) 
    newSlice[indexWhereToInsert]=val 
    fmt.Println("newSlice:", newSlice) 
    fmt.Println("slice:", slice) 

    slice = append(newSlice, slice[indexWhereToInsert:]...) 
    fmt.Println("slice:", slice)  
} 

は(私もむしろ、挿入される値として1をハードコーディングするよりも、val変数を追加したことに注意してください:

これを解決するには、明示的なコピーを作成する必要があります。)

+0

これはたくさん説明します!私は、追加すると新しいスライスを返すと思った。タンク! – David

+0

@David:[Go Slices:usage and internals](https://blog.golang.org/go-slices-usage-and-internals)はあなたのための良い読書です。 – Flimzy

+1

コピーなしで移動するためのバージョンはhttps://play.golang.org/p/KGcvoIF3bKです – David

関連する問題