interface 定义一组方法的契约,不关心实现细节。实现它时可以用值类型(struct 本身),也可以用指针类型。一般建议用指针,理由有三个。
方法集一致
Go 里值类型和指针类型的方法集不一样:值类型只有值接收器的方法,指针类型同时拥有指针接收器和值接收器的方法。
后果是,如果用值类型实现接口,只有把对象按值传递时才能调到那些方法,按指针传就不满足了。用指针类型实现接口,两种传递方式都能用,代码不必因为传参形式不同而改。
避免拷贝
用值类型实现接口时,每次调方法都会拷一份值。对象大一点,这个开销就不小了。指针只传地址,没有这个成本。
能改对象状态
指针改的是原对象,值类型改的是副本。如果实现接口的目的就是改状态,只能用指针。
什么时候不用指针
简单的小对象用值类型也没问题:既没有拷贝的性能顾虑,也不涉及修改状态。选指针主要是为了方法集一致和性能,不是一条绝对规则。
评论
还没有人留言。