Go에서 포인터 수신기 기능을 사용하면 수신기 개체의 값을 수정할 수 있습니다. 그러나 성공적인 구현을 위해서는 Go에서 포인터가 어떻게 작동하는지 이해하는 것이 중요합니다.
포인터 수신 방법을 통해 단순 유형의 값을 수정하려고 할 때 다음과 같은 상황이 발생할 수 있습니다. 변경 사항은 메서드 외부에서 유지되지 않습니다. 이는 수신자를 포함한 모든 메소드 인수가 메소드 실행 내에서 로컬로 복사되기 때문입니다.
제공된 예에서:
func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp }
fi 포인터 인수는 main에 있는 원본 fi 포인터의 복사본입니다. 따라서 FromString 메서드 내에서 복사된 fi 포인터에 대한 변경 사항은 원본 포인터가 아닌 로컬 복사본에만 영향을 미칩니다.
이 문제를 해결하려면 다음과 같은 몇 가지 옵션이 있습니다.
업데이트된 포인터를 수신자에 할당하는 반환 문을 만든 다음 반환된 포인터를 main에서 다시 할당합니다.
// Return the updated pointer and reassign it in main func (fi *FooInt) FromString(i string) *FooInt { num, _ := strconv.Atoi(i) tmp := FooInt(num) return &tmp } // Reassign the updated pointer in main func main() { var fi *FooInt fi = fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5 }
대상 유형의 nil이 아닌 포인터를 메서드에 대한 인수로 전달합니다.
// Pass a non-nil pointer as an argument func (fi *FooInt) FromString(i string, p **FooInt) { num, _ := strconv.Atoi(i) tmp := FooInt(num) *p = &tmp } // Create a non-nil pointer and pass it to the method in main func main() { var fi *FooInt fi.FromString("5", &fi) fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5 }
수정하기 전에 수신자 포인터가 Nil이 아닌지 확인하세요.
// Check if the receiver is non-nil before modifying func (fi *FooInt) FromString(i string) { if fi == nil { return } num, _ := strconv.Atoi(i) *fi = FooInt(num) } // Create a non-nil receiver in main func main() { fi := new(FooInt) fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5 }
위 내용은 Go에서 포인터 수신기 메서드를 통해 값을 수정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!