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