Go의 구조체 필드 복귀
Go 프로그램 내에서 구조체의 필드를 수정하려고 하면 다음과 같은 시나리오가 발생할 수 있습니다. 필드가 원래 값으로 되돌아가는 것 같습니다. 이 문제는 Go에서 구조가 값으로 전달되는 방식으로 인해 발생합니다.
코드에서 MockConnector 구조체에는 last_command와 value라는 두 개의 필드가 있습니다. MockConnector의 sendCommand 메소드는 이러한 필드를 수정합니다. 그러나 TVManager 구조체에서 Manager.sendMessage를 호출하면 커넥터 인스턴스를 값으로 전달합니다. 이는 sendCommand가 원본에 대한 참조가 아닌 커넥터 구조의 복사본을 수신함을 의미합니다.
이 문제를 해결하려면 관련 구조에 대한 포인터를 사용해야 합니다. 구조에 대한 포인터를 전달함으로써 메모리의 실제 구조에 대한 참조를 전달합니다. 이를 통해 구조체의 필드를 직접 수정할 수 있습니다.
수정된 코드:
func (this *MockConnector) sendCommand(payload map[string]string) { fmt.Println("0", this) this.last_command = payload this.value = true fmt.Println("0", this) }
MockConnector 구조체에 대한 포인터를 수신하도록 sendCommand 메서드를 수정하여, 이제 복사본 대신 실제 커넥터 인스턴스를 수정합니다.
수신자 이름:
또한 Go에서 이를 수신기 이름으로 사용하지 않는 것이 모범 사례로 간주됩니다. 구조체 메서드. 대신, 더 설명적인 이름을 사용하여 수신기 유형을 나타냅니다.
일관된 메서드 세트:
구조체의 한 메서드에 포인터 수신기가 필요한 경우 다음을 수행하는 것이 좋습니다. 해당 구조체의 모든 메서드가 포인터 수신기를 사용하도록 만듭니다. 이렇게 하면 수신자가 값인지 포인터인지에 관계없이 메서드 집합의 일관성이 보장됩니다.
이러한 권장 사항을 적용하면 Go 프로그램에서 필드 값이 되돌리는 문제를 제거할 수 있습니다.
위 내용은 내 Go 구조체 필드가 수정되면 왜 원래 값으로 되돌아가나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!