请教同行们一个关于go方法的问题

930415915 · 2017-03-07 08:18:12 · 2097 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-03-07 08:18:12 的主题,其中的信息可能已经有所发展或是发生改变。

假设定义一个结构体

type A struct{
}

定义一个方法:

func (self *A) SayHi() {
        fmt.println("你好")
}

我想问方法第一个括号里加 * 与不加 * 有什么区别。测试好像没什么区别。请高手指点下。 我是在网上看到下面这句话才想问的,我不太懂。

对于接口的执行机制: 
1.T仅拥有属于T类型的方法集,而*T则同时拥有(T+*T)方法集
2.基于T实现方法,表示同时实现了interface和interface(*T)接口
3.基于*T实现方法,那就只能是对interface(*T)实现接口

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2097 次点击  
加入收藏 微博
6 回复  |  直到 2017-03-09 08:24:23
blov
blov · #1 · 8年之前

说起来话长,我只能说,你这里没区别。先看看基础知识吧!

leon
leon · #2 · 8年之前

简单的说, 如果这个方法要改变self ,请用指针,如果不改变的话, 两者都可以

930415915
930415915 · #3 · 8年之前
leonleon #2 回复

简单的说, 如果这个方法要改变self ,请用指针,如果不改变的话, 两者都可以

我是在网上看到下面这句话才想问的,例子我也举不出。您看看

对于接口的执行机制: 1.T仅拥有属于T类型的方法集,而T则同时拥有(T+T)方法集 2.基于T实现方法,表示同时实现了interface和interface(T)接口 3.基于T实现方法,那就只能是对interface(*T)实现接口

930415915
930415915 · #4 · 8年之前
leonleon #2 回复

简单的说, 如果这个方法要改变self ,请用指针,如果不改变的话, 两者都可以

抱歉,看我修改的帖子,回复中的星号不显示

leon
leon · #5 · 8年之前

a1 := &A{} a1可以调用 SayHi a2 := A{} a2不可以调用SayHi 所以尽量用指针 你的1 是对的, 2 和3 是错的, T只含有T的, T 包含了T和T的

tandong
tandong · #6 · 8年之前
leonleon #2 回复

简单的说, 如果这个方法要改变self ,请用指针,如果不改变的话, 两者都可以

没毛病; 在适当的情况下用*能节约一些栈空间,效率更高

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传