Go에서 포인터를 통해 값 변경
Go에서는 포인터를 함수에 전달하면 지정된 값을 직접 조작할 수 있습니다. 그러나 포인터에 값을 할당할 때 고려해야 할 특정 뉘앙스가 있습니다.
값 수정 없이 포인터 할당
다음 코드를 고려하세요.
<code class="go">type Test struct { Value int } func main() { var i Test = Test{2} var p *Test = &i f(p) println(i.Value) // 2 } func f(p *Test) { // Assigning a new pointer value p = &Test{4} }</code>
이 코드에서 p는 i 구조체에 대한 포인터입니다. f 함수 내에서 p에 새 포인터 값을 할당해도 i 값은 수정되지 않습니다. 이는 p가 f 내의 지역 변수이고 해당 값을 변경하면 로컬 복사본에만 영향을 미치기 때문입니다.
지정 값 수정
i의 값을 실제로 수정하려면 지적된 구조체의 값을 변경해야 합니다. 이는 역참조 연산자(*)를 통해 수행할 수 있습니다. 예:
<code class="go">func f(p *Test) { p.Value = 4 }</code>
여기에서 p.Value는 포인터 p를 역참조하고 지정된 구조체의 Value 필드에 값 4를 할당합니다. 이 변경 사항은 f가 반환될 때 i에 반영됩니다.
포인터에 포인터 할당
또는 f 함수 내에서 포인터 자체를 수정할 수도 있습니다. 그러나 이를 위해서는 포인터 변수(&p)의 주소를 f에 전달해야 합니다.
<code class="go">func f(p **Test) { *p = &Test{4} }</code>
이 경우 *p는 이중 포인터 p를 역참조하고 새 포인터 값을 할당하여 p 변수를 효과적으로 변경합니다. 메인에. 그러나 이 접근 방식은 가리키는 값을 직접 수정하는 것보다 간단하지 않으며 효율성이 떨어질 수 있습니다.
결론
포인터를 함수에 전달할 때는 다음을 이해하는 것이 중요합니다. 새 포인터 할당(p = &Test{4})과 지정된 값 수정(p.Value = 4)의 차이점. 후자의 접근 방식을 사용하면 구조체 값을 직접 조작할 수 있는 반면, 전자는 포인터 자체만 변경합니다.
위 내용은 Go 함수의 포인터를 통해 값을 수정하려면 어떻게 해야 하며, 다른 접근 방식은 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!