GoLang之接口的对象方法和指针方法实现区别

GoLang大坑之接口的对象方法和指针方法

  • 现在大多数语言都是面向对象语言,使用Java之后,尽管非常冗余,但是和c++一样逻辑清晰,没有什么大坑可以踩。但是GoLang注重简洁清晰,经常有莫名大坑出现,比如闭包等。

  • 今天在公司写业务需求的时候,被这个bug坑了老久,呜呜呜~

GoLang接口的几种实现方式–自定义

1. 对象方法

GoLang中类方法分为对象方法和指针方法,分属于不同的方法集,指针可以调用所有方法,而对象只能调用对象方法

下面我们看一个栗子

type People interface {
	FeedCat()
	FeedDog()
}
type XiaoMing struct {
	Name string
}
func (x XiaoMing) FeedCat() {
	fmt.Printf("FeedCat: %p  name=%v\n", &x, x.Name)
	x.Name="小花"
}
func (x XiaoMing) FeedDog() {
	fmt.Printf("FeedDog: %p  name=%v\n", &x, x.Name)
}
func main() {
	ming := XiaoMing{Name: "minxu"}
	fmt.Printf("ming: %p  name=%v\n", &ming, ming.Name)
	ming.FeedCat()
	ming.FeedDog()
}

输出:

ming: 0xc000010200  name=minxu
FeedCat: 0xc000010220  name=minxu
FeedDog: 0xc000010240  name=minxu

我们知道在GoLang中 一切都是值传递(强烈不建议将slice/map作为引用传递来理解,因为slice对象在被拷贝的时候,除了指向数组的指针没变,length和capacity都被拷贝了一份 可以理解为struct{length int,capacity int,ptr *int},所以必然是值传递),
那么为什么上面的对象的地址输出不一样呢?为什么明明在FeedCat中将x.Name改为"小花",后续打印的还是minxu呢?因为GoLang的对象方法调用会将对象拷贝一份,可以这么理解:

func (x XiaoMing) FeedCat() {}
		|
		| 值传递  将x拷贝了一份
		V
func FeedCat(x XiaoMing) {}

2. 指针方法

根据以下demo可以看出,指针方法是不会拷贝对象本身的

type People interface {
	FeedCat()
	FeedDog()
}
type XiaoMing struct {
	Name string
}
func (x *XiaoMing) FeedCat() {
	fmt.Printf("FeedCat: %p  name=%v\n", x, x.Name)
	x.Name="小花"
}
func (x *XiaoMing) FeedDog() {
	fmt.Printf("FeedDog: %p  name=%v\n", x, x.Name)
}
func main() {
	ming := &XiaoMing{Name: "minxu"}
	fmt.Printf("ming: %p  name=%v\n", ming, ming.Name)
	ming.FeedCat()
	ming.FeedDog()
}

输出:

ming: 0xc000010200  name=minxu
FeedCat: 0xc000010200  name=minxu
FeedDog: 0xc000010200  name=小花

总结

指针方法和对象方法分为不同的方法集挺容易理解的,但是这个拷贝就对c系很不友好,,,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang是一种编程语言,具备强大的接口特性。在Golang中,接口是一种规定了对象必须遵循的行为规范。通过接口,我们可以定义一组方法的集合,任何实现了这些方法的类型都被视为实现了该接口接口实现是指一个类型声明自己遵循了某个接口实现一个接口的类型,需要实现接口中定义的所有方法实现接口的类型不需要显式声明实现了该接口,只要实现接口中定义的方法即可。这种方式称为隐式接口实现接口对象是指一个接口类型的变量或参数,可以指向满足该接口的任何具体类型的对象。通过接口对象,我们可以调用接口中定义的方法,而不需要关心具体对象是哪种类型。 使用接口的好处是可以将接口作为一个统一的契约,使得不同类型的对象可以通过实现相同的接口实现类型的替换和灵活的设计。接口可以实现代码的重用,并且松耦合,提高代码的可维护性和可测试性。 在实际应用中,我们可以先定义接口,然后根据接口的行为规范来编写具体类型的实现接口对象可以根据需要替换为不同的具体类型对象实现了面向接口编程的思想。 总结来说,Golang中的接口实现是指类型声明自己遵循了某个接口实现接口中定义的方法接口对象是指可以指向满足该接口的任何具体类型的对象。通过接口,我们可以实现代码的灵活和重用,使得不同类型的对象可以通过实现相同的接口来进行类型的替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值