2012-10-07 5 views
15

에 조각을 내가 최근있다 다시 슬라이스, 지금은 다음 코드와 혼동 :이동을 선택 Golang

package main 

import "fmt" 

func main() { 
    a := make([]int, 5) 
    printSlice("a", a) 
    b := make([]int, 0, 5) 
    printSlice("b", b) 
    c := b[:2] 
    printSlice("c", c) 
    d := c[2:5] 
    printSlice("d", d) 
} 

func printSlice(s string, x []int) { 
    fmt.Printf("%s len=%d cap=%d %v\n", 
     s, len(x), cap(x), x) 
} 

그리고 결과 :

a len=5 cap=5 [0 0 0 0 0] 
b len=0 cap=5 [] 
c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead 
d len=3 cap=3 [0 0 0] 

어떤 도움을 것입니다 감사합니다.

+0

자체 용량의 조각이 올 것입니다 (1.2로 이동). [내 답변 아래] (http://stackoverflow.com/a/18911267/6309) – VonC

답변

20

c은 배열 b에서 가져온 슬라이스입니다. 이것은 사본이 아니며 b의 첫 번째 요소 2 개를 가리키는 창입니다.

b은 5의 용량을 가지므로 c을 확장하여 3 개의 다른 위치를 취할 수 있습니다 (실제로는 새 슬라이스를 만들지 만 메모리의 동일한 위치를 차지함).

array : [0 0 0 0 0 0 0 0 0 0 0 0] 
array : <---- capacity ---> 
slice :  [0 0 0 0] 
slice :  <---- capacity ---> 

어쩌면이 프로그램은 C와 D는 것을 더 명확하게됩니다

슬라이스의 최대 용량은 기본으로되는 배열의 용량을 뺀 배열의 슬라이스의 시작 위치입니다

func main() { 
    b := make([]int, 0, 5) 
    c := b[:2] 
    d := c[1:5] // this is equivalent to d := b[1:5] 
    d[0] = 1 
    printSlice("c", c) 
    printSlice("d", d) 
} 

출력 : :에 그

c len=2 cap=5 [0 1] // modifying d has modified c 
d len=4 cap=4 [1 0 0 0] 
+2

도움이 답변을 주셔서 감사합니다. – Coder

+1

그래서 b도 영향을 미칩니 까? – Coder

+1

예. 길이가 0이기 때문에 그것을 볼 수 없습니다. –

11

참고 B 이상 단지 창 1.2 (Q4 2013, 1.2rc1 is available now), 으로 이동하면 (기본 배열에서 추론 된 용량 대신)의 용량을 슬라이스에 연결할 수 있습니다.

"Three-index slices"및 design document을 참조하십시오.

슬라이싱 연산은 이미 생성 된 배열 또는 슬라이스의 연속 부분을 기술함으로써 슬라이스를 새로 작성

var array [10]int 
slice := array[2:4] 

슬라이스의 용량 요소의 최대 개수 인 것을 슬라이스는 reslicing 후에도 유지 될 수 있습니다. 기본 배열의 크기를 반영합니다. 이 예에서
는 슬라이스 가변 용량 8.

(기본 어레이의 용량을 뺀 어레이의 슬라이스의 선두의 위치)이다

array : [0 0 0 0 0 0 0 0 0 0] 
array : <---- capacity ---> 
slice : [0 0] 
slice : <-- capacity --> 8 (10-2) 

이동 1.2에서는 슬라이싱 작업을 허용하는 새로운 구문을 추가하여과 용량을 지정하는 을 추가합니다.
두 번째 콜론은 용량 값을 가져 오며 소스 슬라이스 또는 배열의 용량보다 작거나 같아야하며 원본 크기는입니다.예컨대

,

slice = array[2:4:6] 

array : [0 0 0 0 0 0 0 0 0 0] 
array : <---- capacity ---> 10 
slice : [0 0] 
slice : <- cap->   4 (6-2) 

는 이전 예에서와 동일한 길이를 갖도록 슬라이스를 설정하지만, 그 용량은 이제 4 소자 (6-2)이다.
이 새 슬라이스 값을 사용하여 원래 배열의 마지막 두 요소에 액세스하는 것은 불가능합니다.

주요 인수는 append을 통해 프로그래머에게 더 많은 제어를 제공하는 것입니다.

a[i : j : k] 

슬라이스 갖는다 : 용량 k - i

평가 패닉 같음

  • j - ii <= j <= k <= cap(a)에 해당하지 않은 경우

    • 인덱스 0
    • 길이부터 같음.