슬라이스 변환에서 식별자 주소 유지
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에 고유한 포인터가 포함되도록 보장하는 독립적인 포인터 값을 생성합니다.
식별자 주소 보존의 의미
식별자 보존에 유의하는 것이 중요합니다. 주소에는 특정 의미가 있습니다.
위 내용은 문자열의 Go 슬라이스를 문자열 포인터의 슬라이스로 변환할 때 원래 메모리 주소를 보존하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!