Go에서 메서드의 포인터 수신기를 사용하면 구조체의 원래 값을 수정할 수 있습니다. 그러나 이는 단순 유형에는 적용되지 않습니다. 이 질문은 그러한 수정이 작동하지 않는 이유를 자세히 알아보고 해결책을 제시합니다.
다음 코드를 고려하세요.
package main import ( "fmt" "strconv" ) type FooInt int func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp } func main() { var fi *FooInt fi.FromString("5") fmt.Printf("%v\n", fi) // Prints <nil> }
여기서 FromString 함수를 기대할 수 있습니다. fi의 값을 5로 설정합니다. 그러나 nil을 나타내는
Go에서 수신자를 포함한 함수/메서드 인수는 원래 값의 복사본입니다. 결과적으로 함수 내 수정은 복사본에만 영향을 미칩니다.
포인터의 경우에도 수신자는 실제 포인터 자체가 아닌 원본 포인터의 복사본입니다. 따라서 수신자의 값을 수정해도 원래 포인터에는 영향을 미치지 않습니다.
이 문제를 해결하려면 다음과 같은 몇 가지 옵션이 있습니다.
수정된 내용 반환 포인터:
func (fi *FooInt) FromString(i string) *FooInt { num, _ := strconv.Atoi(i) tmp := FooInt(num) return &tmp } func main() { var fi *FooInt fi = fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
포인터 전달 수정:
func (fi *FooInt) FromString(i string, p **FooInt) { num, _ := strconv.Atoi(i) tmp := FooInt(num) *p = &tmp } func main() { var fi *FooInt fi.FromString("5", &fi) fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
Nil이 아닌지 확인 수신자:
func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) *fi = FooInt(num) } func main() { fi := new(FooInt) // Initialize to non-nil fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
이러한 솔루션 중 하나를 채택하면 포인터 수신기를 사용하여 단순 유형의 값을 효과적으로 수정할 수 있습니다.
위 내용은 Go에서 포인터 수신기를 사용하여 단순 유형의 값을 수정할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!