2017-04-25 1 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

이것은 많은 것을 설명합니다! 나는 append가 새로운 슬라이스를 리턴한다고 생각했다. 탱크! – David

+0

@David : [Go Slices : 사용법 및 내부 구조] (https://blog.golang.org/go-slices-usage-and-internals)는 좋은 읽을 거리입니다. – Flimzy

+1

다음은 복사없이 이동하는 버전입니다. https://play.golang.org/p/KGcvoIF3bK – David

관련 문제