내 목적은 특정 조각에서 하나 개의 요소를 제거하는 것입니다, 그리고 코드가 같은 것입니다 :함수 호출을 통해 슬라이스의 길이 또는 용량을 수정할 수없는 이유는 무엇입니까?
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) 용량
할 함수에 슬라이스를 통과하면, 사본을 전달된다
슬라이스는 ** 참조 유형이 아니며 실제로는 아닙니다. –
또한 [Golang이 항목을 슬라이스에 추가] (https://stackoverflow.com/questions/20195296/golang-append-an-item-to-a-slice)와 중복 될 수 있습니다. –
슬라이스는 참조 유형이 아니지만 [메모리 낭비를 피하기 위해 포인터 또는 기능적으로 동일한 기능을 사용합니다] (https://play.golang.org/p/8CBxmyBJjl). 즉, 메모리가 두 슬라이스간에 공유되지만 길이와 대문자가 다를 수 있습니다. 그것들은 본질적으로 두 가지 다른 항목입니다. 이동 블로그 항목 인 "이동 슬라이스 : 사용 및 내부 구조", 특히 [이 섹션] (https://blog.golang.org/go-slices-usage-and-internals#TOC_4)에서 슬라이스에 대한 자세한 내용을 볼 수 있습니다. –