2017-10-18 1 views
-1

내 목적은 특정 조각에서 하나 개의 요소를 제거하는 것입니다, 그리고 코드가 같은 것입니다 :함수 호출을 통해 슬라이스의 길이 또는 용량을 수정할 수없는 이유는 무엇입니까?

func main() { 
    s := []int{0, 1, 2, 3, 4} 
    remove(s, 3) 
    fmt.Println(s, len(s), cap(s)) 
} 

func remove(s []int, idx int) { 
    if idx < 0 || idx >= len(s) { 
     return 
    } 
    copy(s[idx:], s[idx+1:]) 
    s = s[:len(s)-1] 
    fmt.Println(s, len(s), cap(s)) 
} 

하지만 출력했다 :

[0 1 2 4] 4 5 [0 1 2 4 4] 5 5

내가 아는 한, 슬라이스에 전달됩니다 참조 형식으로 함수 호출, 왜 그것을 수정할 수 있습니까?

1) 포인터가 기본 배열

2) 길이

3) 용량

할 함수에 슬라이스를 통과하면, 사본을 전달된다

+5

슬라이스는 ** 참조 유형이 아니며 실제로는 아닙니다. –

+1

또한 [Golang이 항목을 슬라이스에 추가] (https://stackoverflow.com/questions/20195296/golang-append-an-item-to-a-slice)와 중복 될 수 있습니다. –

+0

슬라이스는 참조 유형이 아니지만 [메모리 낭비를 피하기 위해 포인터 또는 기능적으로 동일한 기능을 사용합니다] (https://play.golang.org/p/8CBxmyBJjl). 즉, 메모리가 두 슬라이스간에 공유되지만 길이와 대문자가 다를 수 있습니다. 그것들은 본질적으로 두 가지 다른 항목입니다. 이동 블로그 항목 인 "이동 슬라이스 : 사용 및 내부 구조", 특히 [이 섹션] (https://blog.golang.org/go-slices-usage-and-internals#TOC_4)에서 슬라이스에 대한 자세한 내용을 볼 수 있습니다. –

답변

5

슬라이스 세 값을 보유 그 세 가지 가치 전부의 따라서 길이와 용량은 변경할 수 없지만 기본 배열에 대한 포인터가 있으므로 배열 내부의 값을 변경할 수 있습니다.

2

슬라이스는 포인터 유형이 아닙니다. 후드 슬라이스 아래에는 길이, 용량 및 배열에 대한 포인터의 3 가지 값이 있습니다. 가치로 전달하면 길이와 용량의 사본을 얻을 수 있습니다 - 당신을 위해 변경할 수 있습니다. 배열에 대한 변경 사항은 함수 외부에서 볼 수 있습니다.

그런 결과가 나온다면

관련 문제