> 백엔드 개발 > Golang > 문자열의 Go 슬라이스를 문자열 포인터의 슬라이스로 변환할 때 원래 메모리 주소를 보존하는 방법은 무엇입니까?

문자열의 Go 슬라이스를 문자열 포인터의 슬라이스로 변환할 때 원래 메모리 주소를 보존하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-26 11:09:14
원래의
499명이 탐색했습니다.

How to Preserve Original Memory Addresses When Converting a Go Slice of Strings to a Slice of String Pointers?

슬라이스 변환에서 식별자 주소 유지

Go에서 문자열 슬라이스(values1)를 문자열에 대한 포인터 슬라이스(values2)로 변환 )는 독특한 도전을 제시합니다. 아래 제공된 코드는 문제를 보여줍니다.

values1 := []string{"a", "b", "c"}
var values2 []*string
for _, v := range values1 {
    fmt.Printf("%p | %T\n", v, v)
    values2 = append(values2, &v)
}
로그인 후 복사

아마도 출력에서는 값이 다르지만 value2의 각 요소가 동일한 메모리 주소를 가리키는 것으로 나타납니다. 이는 범위 루프 변수 v가 ​​원래 문자열 값에 대한 포인터가 아니라 복사본이기 때문에 발생합니다. 결과적으로 루프 내에서 새 값이 할당되더라도 v는 문자열 값으로 유지됩니다.

솔루션 구현

이 문제를 해결하려면 주소를 추가해야 합니다. 원래 슬라이스 요소를 value2로 설정합니다. 가능한 두 가지 해결 방법은 다음과 같습니다.

1. 원본 슬라이스 인덱싱

for i, _ := range values1 {
    values2 = append(values2, &values1[i])
}
로그인 후 복사

인덱싱을 통해 슬라이스 요소에 액세스하여 원하는 포인터 주소를 얻고 고유한 값을 보존합니다.

2. 임시 변수 사용

for _, v := range values1 {
    v2 := v
    values2 = append(values2, &v2)
}
로그인 후 복사

이 접근 방식에서는 각 문자열 값을 보관할 임시 변수(v2)를 선언합니다. v2를 &v2에 할당함으로써 value2에 고유한 포인터가 포함되도록 보장하는 독립적인 포인터 값을 생성합니다.

식별자 주소 보존의 의미

식별자 보존에 유의하는 것이 중요합니다. 주소에는 특정 의미가 있습니다.

  • 값의 백업 배열1이 유지됩니다. value1과 value2에 모두 도달할 수 있는 한 메모리에 저장됩니다.
  • values1 요소에 대한 수정 사항은 value2에 반영됩니다.
  • values1이 가비지 수집되는 것을 방지하려면 다음과 같이 인덱싱 또는 임시 변수를 사용합니다. 위의 솔루션에 설명되어 있습니다.

위 내용은 문자열의 Go 슬라이스를 문자열 포인터의 슬라이스로 변환할 때 원래 메모리 주소를 보존하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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