Go에서 슬라이스에서 복사할 때 메모리 주소 재사용
Go에서 범위를 사용하여 슬라이스에서 값을 복사하는 특이한 동작을 발견했습니다. 루프로 인해 출력에 중복된 메모리 주소가 발생했습니다. 이 문제를 해결하기 위해 코드를 수정하여 예상되는 고유 주소를 생성하는 임시 변수를 생성했습니다.
이 동작은 원본 코드에서 루프 변수 항목이 슬라이스의 현재 요소에 대한 포인터이기 때문에 발생합니다. . 슬라이스를 반복할 때 Go는 이 포인터 변수를 재사용하여 반복할 때마다 값을 변경하지만 동일한 메모리 주소를 유지합니다. 결과적으로 &item을 출력 슬라이스에 할당하면 동일한 메모리 주소가 여러 번 실수로 복제됩니다.
이러한 재사용을 방지하기 위해 수정된 코드에서는 현재 요소의 복사본을 보관하는 임시 변수 i를 생성합니다. 이렇게 하면 Go가 각 반복마다 새로운 메모리 할당을 생성하여 출력 슬라이스에 고유한 주소가 생성됩니다.
이 개념을 설명하려면 다음 예를 고려하세요.
package main import "fmt" type Region struct { Name string } func main() { // Create a slice of Region objects. regions := []Region{ {Name: "Central"}, {Name: "East"}, } // Original code - duplicates memory addresses fmt.Println("Original Code:") models1 := make([]Model, len(regions)) for idx, item := range regions { models1[idx] = &item } for _, m := range models1 { fmt.Println(m) } // Modified code - generates unique memory addresses fmt.Println("Modified Code:") models2 := make([]Model, len(regions)) for idx, _ := range regions { i := regions[idx] models2[idx] = &i } for _, m := range models2 { fmt.Println(m) } }
이 코드 실행 , 원래 코드는 중복된 메모리 주소를 인쇄하는 반면 수정된 코드는 고유한 주소를 생성하는 것을 확인할 수 있습니다.
위 내용은 범위 루프를 사용하여 Go 슬라이스에서 복사할 때 메모리 주소가 중복되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!