关于x,y = y,x的实现,以及method receiver的一些问题

agolangf · 2014-10-20 10:12:02 · 3496 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2014-10-20 10:12:02 的主题,其中的信息可能已经有所发展或是发生改变。

不知道有没有深入研究过go的大侠,可以帮忙解惑一下2个问题:

1、类似python的变量交换的实现方式内部是怎样实现的(x,y = y,x).我觉得作为命令式语言,不借助中间变量来完成2个变量的交换是不太可能的

2、当定义struct的method的时候,receiver可以采用指针,也可以直接使用struct类型,我想问的是:对下面的代码:

func (p Person) Name() string {
   //blabla
}
var p1 = new(Person)
p1.Name() //这里面p是不是对p1进行了一次取值操作?
var p2 = Person{...略}
p2.Name() //这里面p是不是对p1进行了一次拷贝操作?

对于method receiver的类型到底用struct还是struct *,有没有什么最佳实践指导?谢谢


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

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

3496 次点击  
加入收藏 微博
5 回复  |  直到 2014-10-20 10:36:46
Unknwon
Unknwon · #1 · 10年之前

以下纯属个人见解:

1.此为 Go 的语法特性,应该是内部考虑到了这种情况,所以做了特殊处理。

2.根据你方法的定义,p1 和 p2 均是是整个 Person 结构做了一次拷贝。如果修改为

func (p *Person) Name() string {
    //blabla
}

则是对 p 的地址进行拷贝,然后取值操作

Unknwon
Unknwon · #2 · 10年之前

这玩意代码渲染有问题。。

func (p *Person) Name() string { 
    //blabla 
}
polaris
polaris · #3 · 10年之前
UnknwonUnknwon #2 回复

这玩意代码渲染有问题。。 func (p *Person) Name() string { //blabla }

是啊……一直想找一个好用的 Markdown Editor

Unknwon
Unknwon · #4 · 10年之前

对于method receiver的类型到底用struct还是struct *,有没有什么最佳实践指导?

一般情况下我自己都是用的 *Person,如果你要对结构做出修改,就必须这么写。

如果你不对结构做出修改,然后结构包含的内容又是很少的:例如

type Person struct{
    name string
    age int
}

name和age都不会很大,对它们的值拷贝一次的消耗可能要比拷贝指针再取值要小

agolangf
agolangf · #5 · 10年之前
UnknwonUnknwon #4 回复

> 对于method receiver的类型到底用struct还是struct *,有没有什么最佳实践指导? 一般情况下我自己都是用的 `*Person`,如果你要对结构做出修改,就必须这么写。 如果你不对结构做出修改,然后结构包含的内容又是很少的:例如 type Person struct{ name string age int } name和age都不会很大,对它们的值拷贝一次的消耗可能要比拷贝指针再取值要小

感谢感谢

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