>  기사  >  백엔드 개발  >  모든 방법에 대해 동일한 유형의 수신기를 사용하라는 공식 Go 가이드의 제안에 혼란스러워함

모든 방법에 대해 동일한 유형의 수신기를 사용하라는 공식 Go 가이드의 제안에 혼란스러워함

PHPz
PHPz앞으로
2024-02-10 10:42:08690검색

对 Go 官方指南中关于所有方法使用相同类型接收器的建议感到困惑

php 편집자 Baicao는 모든 방법에 동일한 유형의 수신기를 사용하라는 공식 Go 가이드의 제안에 혼란스러워합니다. Go 언어를 학습하는 과정에서 메소드를 정의할 때 수신자의 유형이 일관되어야 한다는 제안을 자주 접하게 됩니다. 그러나 이 제안은 실제 적용에 있어 몇 가지 질문을 제기합니다. 이 제안의 의미와 목적을 더 잘 이해하기 위해 우리는 이를 깊이 탐구하고 합리적인 설명을 찾으려고 노력할 것입니다.

질문 내용

공식 Go 튜토리얼을 통해 Go를 배우려고 하는데 값과 포인터 수신기에 대한 섹션의 마지막 부분이 혼란스럽습니다.

일반적으로 특정 유형의 모든 메서드에는 값 수신자나 포인터 수신자가 있어야 하지만 둘 다 있으면 안 됩니다. (이유는 다음 몇 페이지에서 알아보겠습니다.)

기본적으로 두 가지 질문이 있습니다.

A) 이 장의 나머지 부분에서 두 가지 유형의 수신기를 혼합하면 안되는 이유를 찾을 수 없는 것 같습니다. 따라서 이 내용이 논의된 섹션을 설명하거나 인용할 수 있는 사람이 있다면 감사하겠습니다.

B) 포인터와 값 수신기를 혼합하는 것이 실제로 나쁜 생각이라고 가정하면 다양한 인터페이스를 어떻게 구현합니까? 예를 들어, 이 튜토리얼에서는 포인터 수신기가 사용되는 두 가지 내장 인터페이스, 즉 Stringererror。在为 Stringer 提供的代码中,使用了值接收器,并且切换到指针接收器似乎不起作用,而在 error 인터페이스를 설명하는 것을 발견했습니다. 위의 원칙을 위반하지 않고 구조체에 대해 이 두 인터페이스를 어떻게 구현할 수 있습니까?

값 수신기와 포인터 수신기 사용의 단점(예: 개체 생성) 및 일관성 유지의 중요성(이 질문에서)과 관련하여 비슷한 질문을 살펴봤지만, 저는 진짜 초보 Scholars For Go이므로, 공식 Go 투어의 정보/예제와 결합해 보았습니다.

감사합니다!

해결 방법

첫 번째 문제의 경우 값 수신기와 포인터 수신기가 모두 있으면 값 수신기가 객체를 복사하므로 미묘한 경합이 발생할 수 있습니다. 예:

으아악

위의 예에서 SetFieldValueReceiver,则您将进行一场竞赛。这是因为,当 SetField 写入字段时,ValueReceiver 두 가지를 모두 호출하면 수신기의 복사본이 생성되어 명시적인 동기화 없이 동일한 필드를 읽게 됩니다.

두 번째 질문: T 的方法,那么让所有方法都使用指针接收器是有意义的。这样您就可以防止微妙的竞争,并实现 T의 모든 인터페이스를 수정한 경우.

다음은 이 주제에 대한 FAQ 링크입니다(@jub0bs에게 감사드립니다):

https://www.php.cn/link/bcc097feafe80f489ef54b0720ca059c

이 예는 다음 게시물을 기반으로 합니다.

https://dave.cheney .net/2015/11/18/wednesday-pop-quiz-spot-the-race

위 내용은 모든 방법에 대해 동일한 유형의 수신기를 사용하라는 공식 Go 가이드의 제안에 혼란스러워함의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제