문자열 슬라이스를 포인터 슬라이스로 변환
이 작업의 목표는 문자열 슬라이스를 다음을 포함하는 슬라이스로 변환하는 것입니다. 각 문자열에 대한 포인터입니다. 구체적인 예를 살펴보겠습니다.
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)
초기 혼란
v가 문자열임에도 불구하고 루프 전체에서 동일한 메모리 주소에 유지된다는 것은 직관에 반하는 것처럼 보일 수 있습니다. . 이는 이 경우 v가 문자열에 대한 포인터가 아니라 value1에 있는 각 문자열의 복사본이기 때문입니다.
두 가지 가능한 솔루션
해결 방법 1:
for i, _ := range values1 { values2 = append(values2, &values1[i]) }
이 메서드는 원래 값1을 값2로 슬라이스합니다. 그러나 이제 value2에는 value1을 직접 가리키는 주소가 포함되어 있으므로 value2가 존재하는 한 value1은 메모리에 유지됩니다.
해결책 2:
for _, v := range values1 { v2 := v values2 = append(values2, &v2) }
이 대체 솔루션은 각 반복마다 임시 지역 변수(v2)를 생성하고 여기에 v 값을 할당한 다음 v2에 포인터를 추가하여 가치2. 이렇게 하면 값1이 값2와 독립적이고 값1에 대한 수정 사항이 값2에 영향을 미치지 않습니다.
위 내용은 Go에서 문자열 조각을 문자열 포인터 조각으로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!