> 백엔드 개발 > Golang > Go에서 직접 슬라이스 변환이 포인터에 동일한 메모리 주소를 재사용하는 이유는 무엇입니까?

Go에서 직접 슬라이스 변환이 포인터에 동일한 메모리 주소를 재사용하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-02 15:40:40
원래의
483명이 탐색했습니다.

Why Does Direct Slice Conversion in Go Reuse the Same Memory Address for Pointers?

Go 슬라이스와 메모리 재사용성

Go 포인터와 관련된 프로젝트에서 흥미로운 문제가 발생했습니다. 문제는 구조체 객체 조각을 인터페이스 조각으로 변환할 때 첫 번째 포인터의 메모리 주소가 출력에 반복적으로 사용된다는 점이었습니다.

이 문제를 해결하기 위해 개발자는 추가 포인터를 사용하도록 변환 함수를 수정했습니다. 변수를 사용하여 예상한 결과를 얻었습니다.

이로 인해 질문이 제기됩니다. 원래 솔루션이 실패한 이유는 무엇입니까? 이를 이해하려면 Go가 포인터와 슬라이스를 처리하는 방법을 자세히 알아볼 필요가 있습니다.

Go에서 *coll 표현식은 기본 배열, 길이 및 용량에 대한 정보가 포함된 슬라이스 헤더를 반환합니다. 슬라이스의 요소에 액세스할 때 인덱스 idx의 요소에 대한 참조를 반환하는 (*coll)[idx] 표현식이 사용됩니다.

원래 솔루션에서 item은 범위의 루프 변수였습니다. *콜 루프. 이 루프는 슬라이스 헤더를 반복하여 슬라이스의 각 요소를 루프 변수 항목에 할당합니다. 그러나 item은 루프 변수이므로 해당 메모리 주소는 루프 전체에서 동일하게 유지됩니다. 따라서 &item이 출력 슬라이스에 추가되면 동일한 메모리 주소가 여러 번 추가되어 관찰된 동작이 발생합니다.

수정된 솔루션은 i := (*coll)[idx] 표현식을 사용합니다. 인덱스 idx의 요소를 지역 변수 i에 할당하는 루프입니다. 이 변수는 루프 변수 항목과 별개의 메모리 주소를 가지므로 &i가 출력 슬라이스에 추가되면 각 요소는 서로 다른 메모리 주소를 갖습니다.

루프 변수 간의 메모리 주소 차이를 설명하려면 그리고 액세스되는 요소에 대해 다음 코드를 고려하십시오.

package main

import "fmt"

func main() {

    coll := []int{5, 10, 15}

    for i, v := range coll {
       fmt.Printf("This one is always the same; %v\n", &v)
       fmt.Println("This one is 4 bytes larger each iteration; %v\n", &coll[i])
    }
}
로그인 후 복사

이 코드를 실행하면 &v가 루프의 모든 반복에 대해 동일한 메모리 주소를 갖는 반면 &coll[i]는 각 반복마다 다른 메모리 주소가 필요합니다.

위 내용은 Go에서 직접 슬라이스 변환이 포인터에 동일한 메모리 주소를 재사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿