"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 포인터는 Go 함수의 값 수정에 어떤 영향을 미치나요?

포인터는 Go 함수의 값 수정에 어떤 영향을 미치나요?

2024-11-07에 게시됨
검색:638

How do pointers affect value modification in Go functions?

Go에서 포인터를 사용한 값 수정 이해

Go에서 포인터를 사용하면 간접적인 액세스와 값 수정이 가능합니다. 그러나 포인터를 함수에 전달할 때 포인터 작동 방식을 이해하는 것이 중요합니다.

포인터를 함수에 전달할 때 값 수정과 포인터 재할당이라는 두 가지 시나리오가 발생합니다.

시나리오 1 : 값 수정

이 코드를 고려하십시오:

type Test struct { Value int }

func main() {
   var i Test = Test {2}
   var p *Test = &i
   f(p)
   println(i.Value)  // 4
}
func f(p *Test) {
   *p = Test{4}
}

여기서 함수 f는 Test 구조체에 대한 포인터를 받습니다. f 내에서 역참조된 포인터(*p)에는 값이 4인 새 Test 구조체가 할당됩니다. 이는 기본 함수의 원래 i 구조체를 효과적으로 수정하며 출력은 4입니다.

Scenario 2: 포인터 재할당

이제 코드를 약간 변경해 보겠습니다.

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) {
   // ?
   p = &Test{4}
}

이 경우 함수는 지정된 값을 수정하는 대신 p 포인터를 값이 4인 새 Test 구조체에 다시 할당합니다. p는 f 내의 지역 변수이므로 이 변경은 영향을 미치지 않습니다. 원본 i 구조체는 기본 함수에 있고 출력은 2로 유지됩니다.

해결 방법: 지정된 값 수정

지정된 값을 수정하려면 포인터를 역참조하고 직접적으로 구조체 멤버에 액세스합니다:

type Test struct { Value int }

func main() {
   var i Test = Test {2}
   var p *Test = &i
   f(p)
   println(i.Value)  // 4
}
func f(p *Test) {
   p.Value = 4
}

p.Value를 사용하여 원래 구조체의 값 필드를 수정하여 4가 출력됩니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3