新人好迷惑。关于方法中的指针接收者的问题。

gostatic · 2018-05-26 17:21:13 · 1251 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-05-26 17:21:13 的主题,其中的信息可能已经有所发展或是发生改变。

type Point struct { x,y int }

func main(){

   p:=&Point{2,4}

   p.double()//可以

   (*p).double()//可以

(&Point{2,4}).double()//可以

(Point{2,4}).double()//报错

}

func (p *Point)double()int{ return p.x+p.y }

编译报错无法获得Point类型字面量的地址。 不明白为什么手动加了&就可以了呢?我看教程上面的解释是无法获取临时变量的地址。 但&不就是取地址操作吗?为什么对Point类型字面量手动取地址就可以调用它的方法呢?


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

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

1251 次点击  
加入收藏 微博
7 回复  |  直到 2018-05-30 13:13:22
Myst21Sid
Myst21Sid · #1 · 7年之前

1、类型T的可调用方法集包含接受者为T或T的所有方法集 2、类型T的可调用方法集包含接受者为T的所有方法 3、类型T的可调用方法集不包含接受者为*T的方法

通俗的说就是,如果方法的接受者是指针(比如你这个方法),只能用指针调用,指针者是实体的话,指针和实体都能调用此方法。 我也是新手,这是我个人看的一些资料后的理解。

YIYIYI
YIYIYI · #2 · 7年之前

建议新人看看这个:https://cloud.tencent.com/developer/doc/1101 刚入门不用太着急,建议教程多看几遍,然后跟着教程一遍自己动手写写

kidlj
kidlj · #3 · 7年之前

Point{2,4} 是一个 struct literal,一个临时数据,不是一个变量,也就是说不能获取这个量的地址(只能获取变量的地址),按理说 &Point{2,4} 是会出错的。但是用 struct literal 初始化一个数据然后获取它的指针是一个非常常用的操作,因此 Go 提供了这样一个语法糖:&Point{2,4},相当于:

o := Point{2, 4} // o 是一个变量
op := &o // 获取变量的指针;正确
op.double() // 正确

Go语言程序设计这本书有讲到这个。

kidlj
kidlj · #4 · 7年之前

《Go程序设计语言》,不是《Go语言程序设计》。

birdkiller
birdkiller · #5 · 7年之前
Myst21SidMyst21Sid #1 回复

1、类型*T的可调用方法集包含接受者为*T或T的所有方法集 2、类型T的可调用方法集包含接受者为T的所有方法 3、类型T的可调用方法集不包含接受者为*T的方法 通俗的说就是,如果方法的接受者是指针(比如你这个方法),只能用指针调用,指针者是实体的话,指针和实体都能调用此方法。 我也是新手,这是我个人看的一些资料后的理解。

```package main

import ( "log" )

type ( A struct { a string } )

func (self A) SetA(a string) { self.a = a }

func (self *A) SetAR(a string) { self.a = a }

func main() { a := A{a: "hello"} a.SetA("Noooooo!") a.SetAR("No!")

b := A{a: "och!"}
b.SetA("haha")
b.SetAR("Ahahahaha!")
log.Println(a, b)

}```

birdkiller
birdkiller · #6 · 7年之前

这MD的格式解释得好感人!

gostatic
gostatic · #7 · 7年之前
kidljkidlj #3 回复

`Point{2,4}` 是一个 struct literal,一个临时数据,不是一个变量,也就是说不能获取这个量的地址(只能获取变量的地址),按理说 `&Point{2,4}` 是会出错的。但是用 struct literal 初始化一个数据然后获取它的指针是一个非常常用的操作,因此 Go 提供了这样一个语法糖:`&Point{2,4}`,相当于: ``` o := Point{2, 4} // o 是一个变量 op := &o // 获取变量的指针;正确 op.double() // 正确 ``` Go语言程序设计这本书有讲到这个。

感谢大佬,原来是个语法糖,你一说我就懂了,非常感谢

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