关于结构和结构体指针

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

在使用结构时,不管是不是用指针隐含的都是使用指针方式的。如下:

package main
import "fmt"
type Vertex struct {
    X int
    Y int
}
func main() {
    v := Vertex{1, 2}
    p := &v
    p.X = 1e9
    fmt.Println(v)
    fmt.Println(v.X)              A
    fmt.Println(p.X)              B
    fmt.Println((*p).X)          C
}

结果:

{1000000000 2}
1000000000
1000000000
1000000000

v为直接使用方式,p为指针使用方式,但在A、B、C三行使用上没有区别,结果也相同。可以理解为两种方式在内部都是按指针方式在使用的。但也有不同的时候比如在使用接口时,如果只定义了直接方法则使用直接方法和指针方法都没有问题。但如果只定义了指针方法,则只能使用指针方法,使用直接方法会出现未定义错误。


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

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

1572 次点击  
加入收藏 微博
1 回复  |  直到 2016-12-19 07:29:01
huangxianghan
huangxianghan · #1 · 8年之前

你这描述,不对吧。你试试函数参数传递结构体和结构体指针看看? 应该说,结构体的指针,会隐式解指针。 也就是说 p.X = 1e9 编译器已经帮你做了 (*p).X = 1e9 这步。

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