มันไม่ชัดเจนมากสำหรับฉันในกรณีนี้ฉันต้องการใช้ตัวรับค่าแทนการใช้ตัวรับตัวชี้เสมอ
สรุปจากเอกสาร:
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
เอกสารกล่าวว่านอกจากนี้ยังมี "สำหรับประเภทเช่นประเภทพื้นฐานชิ้นและ structs ขนาดเล็กรับคุ้มค่าราคาถูกมากดังนั้นถ้าความหมายของวิธีการที่ต้องใช้ตัวชี้รับค่ามีประสิทธิภาพและชัดเจน."
จุดแรกบอกว่า "ถูกมาก" แต่คำถามคือถูกกว่าแล้วตัวรับสัญญาณ ดังนั้นฉันจึงสร้างเกณฑ์มาตรฐานขนาดเล็ก(รหัสในส่วนสำคัญ)ซึ่งแสดงให้ฉันเห็นว่าตัวรับตัวชี้นั้นเร็วกว่าแม้ในโครงสร้างที่มีฟิลด์สตริงเพียงช่องเดียว นี่คือผลลัพธ์:
// 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
(แก้ไข: โปรดทราบว่าจุดที่สองกลายเป็นที่ไม่ถูกต้องในรุ่นใหม่ไปดูความเห็น)
ประเด็นที่สองกล่าวว่า "มีประสิทธิภาพและชัดเจน" ซึ่งเป็นเรื่องของรสนิยมมากกว่าใช่หรือไม่? โดยส่วนตัวแล้วฉันชอบความสม่ำเสมอโดยใช้วิธีเดียวกันทุกที่ ประสิทธิภาพในแง่ใด? ประสิทธิภาพที่ชาญฉลาดดูเหมือนว่าตัวชี้มักจะมีประสิทธิภาพมากกว่า การทดสอบเพียงไม่กี่ครั้งที่มีคุณสมบัติ int เดียวแสดงให้เห็นข้อได้เปรียบน้อยที่สุดของตัวรับค่า (ช่วง 0.01-0.1 ns / op)
ใครช่วยบอกฉันได้ไหมว่าตัวรับค่ามีความหมายมากกว่าตัวรับตัวชี้ หรือฉันทำอะไรผิดพลาดในเกณฑ์มาตรฐานฉันมองข้ามปัจจัยอื่นไปหรือเปล่า?