• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go语言指针方法和值方法,引至string方法的思考

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
在公众号【Go语言中文网】中看到这样一篇面试题 https://mp.weixin.qq.com/s/9G3KQwXqQf56b8IQ7Tyysw
Example1
type Orange struct {
   Quantity int
}

func (o *Orange) Increase(n int) {
   o.Quantity += n
}

func (o *Orange) Decrease(n int) {
   o.Quantity -= n
}

func (o *Orange) String() string {
   return fmt.Sprintf("aaaa %#v", o.Quantity)
}

func main() {
   orange := &Orange{}
   orange.Increase(10)
   orange.Decrease(5)
   fmt.Println(orange)
}
 
先说明指针方法和值方法的区别:
指针方法:例如上述Increase方法,起引用类型为*Orange指针类型,如这种形式的引用所构造的方法为指针方法
值方法:方法的引用类型为正常类型,如func (o Orange) Decrease(n int){}这种形式为值方法
若方法都为值方法
Example2
type Orange struct {
   Quantity int
}

func (o Orange) Increase(n int) {
   o.Quantity += n
}

func (o Orange) Decrease(n int) {
   o.Quantity -= n
}

func (o Orange) String() string {
   return fmt.Sprintf("aaaa %#v", o.Quantity)
}

func main() {
   var orange Orange
   orange.Increase(10)
   orange.Decrease(5)
   fmt.Println(orange)
}
则会执行String方法里面输出5
若方法为指针方法
Example3
type Orange struct {
   Quantity int
}

func (o *Orange) Increase(n int) {
   o.Quantity += n
}

func (o *Orange) Decrease(n int) {
   o.Quantity -= n
}

func (o *Orange) String() string {
   return fmt.Sprintf("aaaa %#v", o.Quantity)
}

func main() {
   var orange Orange
   orange.Increase(10)
   orange.Decrease(5)
   fmt.Println(orange)
}
这种情况下不会执行string方法
这里是否会执行string方法,需要考虑一下为啥会执行String方法,最开始我看到这道题的时候,很疑惑为什么没有调用String方法,却会调用String方法,后来突然想到String方法是go原生的一个方法,调用时会默认执行该方法,当写了String方法时,覆盖了go的String方法,所以会默认执行该方法。了解了这个问题,下面开始说为什么Example3不会执行String方法,因为String的引用类型为指针类型,而orange为struct类型,默认不会执行,当orange定义为orange := &Orange,orange为指针类型,即类型的地址。

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go中导入包的几种方式发布时间:2022-07-10
下一篇:
Ubuntu18上安装Go和GoLand发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap