2017-05-23 6 views
0

私は、コードを示し、それは、go play非常に単純です:スライスリードの要素を削除して元のスライスを変更しましたか?

上記のコードで
package main 

import (
    "fmt" 
) 

func main() { 
    a := []int{1,2,3,4,5,6} 
    for i:=0 ; i < len(a); i++ { 
     b := append(a[:i], a[i+1:]...) 
     fmt.Println(b) 
    } 
    fmt.Println(a) 
} 

、私はスライスを持っている、と私はそれがループ内の要素の削除したかったです。

23456 
13456 
12356 
12346 
12345 

が、私が得た:

[2 3 4 5 6] 
[2 4 5 6 6] 
[2 4 6 6 6] 
[2 4 6 6 6] 
[2 4 6 6 6] 
[2 4 6 6 6] 

なぜ私が出力されている願って何

?行くのdocumentスライスの容量が十分でない場合、それは要素のreallocを行い、私も元のスライスで何かを変更したと言う...

誰かが私の説明どのようにこれが起こることができますか?

+1

あなたはコピーを使用して行うことができます欲しい:https://play.golang.org/p/XPiDvJtRFe – abhink

+0

B:= APPEND([:I]、[I + 1は、 :] ...)、確かに、このコードは、 –

答えて

0

私は理由を知っていると思います。

スライスa [:i]は、容量サイズが6のスライスを(元のスライスとして)返します。したがって、appendは新しいスライスを再割り当てせずに元のスライスを使用します。

0
b := append(a[:i], a[i+1:]...) 

このコードはスライスを変更します。 マイコード:

func main() { 
    a := []int{1, 2, 3, 4, 5, 6} 
    for i := 0; i < len(a); i++ { 
     a1 := make([]int,6) 
     copy(a1, a) 
     b := make([]int,5) 
     b = a1[:i] 
     b = append(b, a1[i+1:]...) 
     fmt.Println(b) 
    } 
    fmt.Println(a) 
} 
関連する問題