golang 方法值接受者和指针接受者区别

本文展示了在Go语言中,接口的实现如何受方法接收者类型(值类型或指针类型)影响。当方法的接收者是值类型时,即使没有显式为指针类型定义方法,Go也会隐含实现。然而,如果方法接收者是指针类型,那么只有通过指针才能调用这些方法。文章通过BMWCar和BenzCar两个结构体的例子,演示了值类型和指针类型在调用方法以及修改对象属性时的区别。

package main

import "log"

type Car interface {
	Driving()
	Brake()
}

type BMWCar struct {
	Name string
}

func (b BMWCar) Driving() {
	log.Printf("%s driving", b.Name)
}

func (b BMWCar) Brake() {
	log.Printf("%s brake", b.Name)
}

func (b BMWCar) ChangeName(name string) {
	b.Name = name
}

type BenzCar struct {
	Name string
}

func (b *BenzCar) Driving() {
	log.Printf("%s driving", b.Name)
}

func (b *BenzCar) Brake() {
	log.Printf("%s brake", b.Name)
}

func (b *BenzCar) ChangeName(name string) {
	b.Name = name
}

func main() {
	// 实现了接收者是值类型的方法,会隐含地也实现了接收者是指针类型的方法
	var bmw1 Car = BMWCar{Name: "bmw car"}
	bmw1.Driving()
	bmw1.Brake()

	var bmw2 Car = &BMWCar{Name: "bmw car"}
	bmw2.Driving()
	bmw2.Brake()

	var benz1 Car = &BenzCar{Name: "benz car"}
	benz1.Driving()
	benz1.Brake()

	// 仅仅定义了指针接受者,不会隐含地也实现了接收者是值类型的方法
	// error: cannot use BenzCar{} (value of type BenzCar) as type Car in variable declaration: BenzCar does not implement Car (Brake method has pointer receiver)
	// var benz2 Car = BenzCar{}
	// benz2.Driving()
	// benz2.Brake()

	// 定义:如果方法的接收者是值类型,无论调用者是对象还是对象指针,修改的都是对象的副本,不影响调用者
	/**==== change name ====**/
	/** out put
	bmw car driving
	bmw car brake
	*/
	var bmw3 = BMWCar{Name: "bmw car"}
	bmw3.ChangeName("new bmw car")
	bmw3.Driving()
	bmw3.Brake()

	/** out put
	bmw car driving
	bmw car brake
	*/
	var bmw4 Car = &BMWCar{Name: "bmw car"}
	bmw3.ChangeName("new bmw car")
	bmw4.Driving()
	bmw4.Brake()

	// 定义: 如果方法的接收者是指针类型,则调用者修改的是指针指向的对象本身
	/**==== change name ====**/
	/** out put
	new benz car driving
	new benz car brake
	*/
	benz3 := BenzCar{Name: "bmw car"}
	benz3.ChangeName("new benz car")
	benz3.Driving()
	benz3.Brake()

	/** out put
	new benz car driving
	new benz car brake
	*/
	benz4 := BenzCar{Name: "bmw car"}
	benz4.ChangeName("new benz car")
	benz4.Driving()
	benz4.Brake()
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值