항상 포인터 수신기를 사용하는 대신 값 수신기를 사용하고 싶은 경우에는 매우 불분명합니다.
문서에서 요약하려면 :
type T struct {
a int
}
func (tv T) Mv(a int) int { return 0 } // value receiver
func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver
문서는 "같은 기본 유형, 조각, 작은 구조체와 같은 유형의 경우, 값 수신기가 아주 싼 방법의 의미가 포인터를 요구하지 않는, 그래서 값 수신기가 효율적이고 분명하다."또한 말한다
첫 번째 요점 은 "매우 저렴"하다고 말하지만 포인터 수신기보다 더 저렴하다는 것입니다. 그래서 저는 작은 벤치 마크 (요점에 대한 코드)를 만들었습니다. 그 포인터 수신기는 문자열 필드가 하나 뿐인 구조체에서도 더 빠릅니다. 결과는 다음과 같습니다.
// Struct one empty string property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 500000000 3.62 ns/op
// Struct one zero int property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 2000000000 0.36 ns/op
(편집 : 최신 go 버전에서는 두 번째 포인트가 유효하지 않게되었습니다 . 주석 참조) .
두 번째 요점 은 "효율적이고 명확하다"는 것이 맛의 문제가 아닙니다. 개인적으로 나는 모든 곳에서 동일한 방식으로 일관성을 선호합니다. 어떤 의미에서 효율성? 성능면에서 포인터가 거의 항상 더 효율적으로 보입니다. 하나의 int 속성을 사용하는 몇 번의 테스트 실행은 Value 수신기의 이점을 최소화했습니다 (범위 0.01-0.1 ns / op).
누군가 값 수신기가 포인터 수신기보다 명확하게 이해되는 경우를 말할 수 있습니까? 아니면 벤치 마크에서 뭔가 잘못하고 있습니까? 다른 요인을 간과 했습니까?