Tôi không rõ trong trường hợp nào thì tôi muốn sử dụng bộ thu giá trị thay vì luôn sử dụng bộ thu con trỏ.
Để tóm tắt từ tài liệu:
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
Các tài liệu cũng cho biết "Đối với các kiểu như kiểu cơ bản, các lát cắt và cấu trúc nhỏ, bộ thu giá trị rất rẻ, vì vậy trừ khi ngữ nghĩa của phương thức yêu cầu một con trỏ, bộ nhận giá trị hiệu quả và rõ ràng."
Điểm đầu tiên nó nói nó là "rất rẻ", nhưng câu hỏi nhiều hơn là nó rẻ hơn sau đó là máy thu con trỏ. Vì vậy, tôi đã thực hiện một điểm chuẩn nhỏ (mã trên ý chính) cho tôi thấy rằng bộ thu con trỏ nhanh hơn ngay cả đối với một cấu trúc chỉ có một trường chuỗi. Đây là những kết quả:
// 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
(Chỉnh sửa: Xin lưu ý rằng điểm thứ hai trở nên không hợp lệ trong các phiên bản go mới hơn, xem nhận xét) .
Điểm thứ hai mà nó nói, đó là "hiệu quả và rõ ràng", đó là vấn đề về hương vị, phải không? Cá nhân tôi thích nhất quán bằng cách sử dụng ở mọi nơi theo cùng một cách. Hiệu quả theo nghĩa nào? hiệu suất khôn ngoan có vẻ như con trỏ hầu như luôn luôn hiệu quả hơn. Một vài lần chạy thử nghiệm với một thuộc tính int cho thấy lợi thế tối thiểu của bộ thu Giá trị (phạm vi 0,01-0,1 ns / op)
Ai đó có thể cho tôi biết một trường hợp mà người nhận giá trị rõ ràng có ý nghĩa hơn sau đó là người nhận con trỏ không? Hay tôi đang làm sai điểm chuẩn, tôi đã bỏ qua các yếu tố khác?