문자열 조각을 포인터 조각으로 변환하는 방법
문자열 조각으로 작업할 때 변환이 필요한 경우가 많습니다. 문자열에 대한 포인터 조각입니다. 이를 통해 매번 역참조할 필요 없이 기본 문자열 값에 직접 액세스할 수 있습니다.
첫 번째 시도
이를 달성하는 한 가지 접근 방식은 문자열 조각을 만들고 각 문자열의 주소를 새 조각에 추가합니다. 그러나 루프 변수 v가 각 반복마다 할당되어 해당 값은 변경되지만 주소는 변경되지 않기 때문에 예상대로 작동하지 않습니다. 결과적으로, 모두 동일한 주소를 가리키는 포인터 조각이 생깁니다.
values1 := []string{"a", "b", "c"} var values2 []*string for _, v := range values1 { fmt.Printf("%p | %T\n", v, v) values2 = append(values2, &v) } fmt.Println(values2) // Output: // %!p(string=a) => string // %!p(string=b) => string // %!p(string=c) => string // [0xc42000e1d0 0xc42000e1d0 0xc42000e1d0]
올바른 해결책
포인터 조각을 올바르게 생성하려면 문자열에는 원본 슬라이스의 적절한 슬라이스 요소의 주소를 추가해야 합니다.
for i := range values1 { values2 = append(values2, &values1[i]) }
이 경우, 루프 변수 i는 원래 슬라이스에 대한 색인을 생성하는 데 사용되어 value2에 추가된 각 주소가 value1의 고유 문자열에 해당하는지 확인합니다.
대체 솔루션
대안 해결책은 임시 지역 변수를 생성하고 해당 변수의 주소를 추가하는 것입니다.
for _, v := range values1 { v2 := v values2 = append(values2, &v2) }
이 접근 방식은 원본 슬라이스 및 수정 사항과 무관합니다. value1에 대한 값은 value2에 영향을 미치지 않습니다.
위 내용은 Go에서 문자열 조각을 문자열에 대한 포인터 조각으로 올바르게 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!