Golang의 슬라이스는 기본 배열을 가리키는 포인터 구조입니다.
이 구조에는 세 가지 속성이 있습니다. 1. 배열에 대한 포인터, 2.len: 슬라이스의 요소 수 3.cap: 슬라이스가 차지하는 메모리 양.
이 세 가지 속성을 깊이 이해해야만 슬라이스를 사용할 때 실수를 피할 수 있습니다. (추천 학습: Go
)
변수의 올바른 이해와 공유여러 슬라이스가 기본 데이터를 공유할 수 있으며, 배열의 일부가 겹칠 수 있습니다. 이 문장에 대한 깊은 이해는 스케줄 프로그래밍에 있어 매우 의미가 깊습니다.
공유된 데이터는 언제 다른 변수에 의해 수정되나요
func f1() { a1 := []int{1,2,3,4,5,6} a2 := a1 a3 := a1[1:3] a1[1] = 999 fmt.Println("a1=",a1,"a2=",a2,"a3=",a3) }
실행 결과
a1= [1 999 3 4 5 6] a2= [1 999 3 4 5 6] a3= [999 3] Process finished with exit code 0
이때 a1이 수정되고 두 변수 모두 수정되는 모습이 확연히 보입니다
언제쯤 될까요? 수정하지 않음
func f2() { a1 := []int{1,2,3,4,5,6} a2 := a1 a3 := a1[1:3] a2 = append(a2,888) a1[1] = 999 fmt.Println("a1=",a1,"a2=",a2,"a3=",a3) }
실행 결과
a1= [1 999 3 4 5 6] a2= [1 2 3 4 5 6 888] a3= [999 3] Process finished with exit code 0
는 a1이 수정되더라도 수정 가능하지만 a2는 수정되지 않습니다. 우리는 추가 기능이 메모리 재할당에 직면할 것이라는 것을 알고 있습니다. 따라서 a2가 추가되면 메모리 공간을 다시 적용하고 원래 배열을 복사하고 새 값을 추가합니다. 즉, 추가 작업이 발생하면 a2는 더 이상 a1과 메모리를 공유하지 않습니다.
슬라이스를 복사할 때 배열을 가리키는 여러 변수가 동시에 발생하는 경우 데이터 공유 및 메모리 재할당을 고려해야 합니다.
위 내용은 골랑 슬라이스를 복사하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!