2012-09-05 7 views
3

GO 언어에서는 조각이 참조로 전달되는 것으로 생각했습니다. 그러나 다음 코드가 슬라이스 c의 내용을 변경하지 않는 이유는 무엇입니까? 내가 놓친 게 있니? 고맙습니다.GO에서 슬라이스의 내용이 변경되지 않는 이유는 무엇입니까?

package main 

import (
    "fmt" 
) 


func call(c []int) { 
    c = append(c, 1) 
    fmt.Println(c) 
} 

func main() { 
    c := make([]int, 1, 5) 
    fmt.Println(c) 
    call(c) 
    fmt.Println(c) 
} 

인쇄 결과는 다음

[0] [0 1] [0]

I 기대하면서

[0] [0 1] [0 1]

답변

11

슬라이스 길이는 참조로 전달되지 않은 슬라이스 헤더에 유지됩니다. 슬라이스는 배열에 대한 포인터, 길이 및 용량을 포함하는 구조체로 생각할 수 있습니다.

슬라이스에 추가 할 때 데이터 배열에서 인덱스 1을 수정 한 다음 슬라이스 헤더의 길이를 증가시킵니다. 반환했을 때 주 기능의 c의 길이는 1 이었으므로 동일한 데이터가 인쇄되었습니다.

슬라이스가 이렇게 작동하는 이유는 동일한 데이터를 가리키는 슬라이스가 여러 개있을 수 있기 때문입니다. 예를 들면 다음과 같습니다.

x := []int{1,2,3} 
y := x[:2] // [1 2] 
z := x[1:] // [2 3] 

세 조각 모두 동일한 기본 배열의 겹치는 데이터를 가리 킵니다.

+0

분명히 설명해 주셔서 감사합니다. – Kid

1

이동은 항상 값에 의해 전달된다. 특정 유형은 포인터,지도, 채널과 같은 참조 유형입니다. 슬라이스 (기본 배열에 대한 참조와 길이 및 용량 값으로 구성)와 같은 부분적으로 참조되는 유형입니다. 그러나 유형에 관계없이 모든 것이 가치에 의해 전달됩니다. 따라서 로컬 변수에 할당하는 것은 외부에 영향을주지 않습니다.

관련 문제