Go语言方法接收者: *号的使用及原因
Go语言方法接收者: *号的使用及原因
在 Go 语言中,定义方法时可以选择使用指针类型或非指针类型作为接收者。例如:gofunc (s *CustomerService) GetVerifyCode(ctx context.Context, req *pb.GetVerifyCodeReq)
和gofunc (s CustomerService) GetVerifyCode(ctx context.Context, req pb.GetVerifyCodeReq)
第一个例子中,GetVerifyCode 方法的接收者类型是 *CustomerService,这是一个指针类型,星号 * 就代表指针。第二个例子中,接收者类型是 CustomerService,这是一个非指针类型。
为什么一般方法定义不去掉 * 号呢?
使用指针类型作为方法的接收者有两个主要优势:
- 
修改接收者的状态: 当使用指针类型作为接收者时,方法内部可以直接修改接收者指向的对象的状态。这是因为指针传递的是对象的地址,方法可以直接操作该地址上的数据。
 - 
避免拷贝: 使用指针类型作为接收者可以避免在方法调用时进行不必要的对象拷贝。Go 语言在方法调用时默认采用值传递,会创建一个接收者的副本。如果接收者是一个很大的结构体,复制操作会带来额外的性能开销。而使用指针,只需传递地址,避免了大对象的复制,提高了效率。
 
何时使用非指针类型接收者?
如果一个方法不需要修改接收者的状态,并且接收者不是一个很大的结构体,那么可以考虑使用非指针类型作为接收者。例如:
- 只读方法: 如果一个方法只是读取接收者的状态,不进行修改,那么使用非指针类型接收者可以更清晰地表达代码的意图。* 简单数据类型: 如果接收者是一个简单的基本类型 (int, string 等),使用非指针类型接收者可以简化代码,因为基本类型的复制开销很小。
 
总结
总的来说,使用指针类型或非指针类型作为方法的接收者需要根据具体情况进行选择。需要综合考虑方法的功能需求、性能影响以及代码可读性等因素。通常情况下,如果方法需要修改接收者的状态或者接收者是一个很大的结构体,建议使用指针类型接收者;否则,可以使用非指针类型接收者。
原文地址: https://www.cveoy.top/t/topic/PMM 著作权归作者所有。请勿转载和采集!