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()
}
golang 方法值接受者和指针接受者区别
最新推荐文章于 2025-12-28 12:38:01 发布
本文展示了在Go语言中,接口的实现如何受方法接收者类型(值类型或指针类型)影响。当方法的接收者是值类型时,即使没有显式为指针类型定义方法,Go也会隐含实现。然而,如果方法接收者是指针类型,那么只有通过指针才能调用这些方法。文章通过BMWCar和BenzCar两个结构体的例子,演示了值类型和指针类型在调用方法以及修改对象属性时的区别。
855

被折叠的 条评论
为什么被折叠?



