golang 被 * & 搞晕了,求解答

clipboard.png
如图
按我的理解

var ticker *Ticker  // 是一个指针变量
ticker = &Ticker{ // 指针指向结构体的地址
    Url: "werwerwer",
    Value: 33333333,
}
fmt.Println(ticker.Url) // 应该输出ticker.Url 的内存地址才对啊,怎么直接是值?

没有系统语言的编程经验
对指针还不太理解
求大神解答

阅读 4.1k
4 个回答

你的Ticker结构体中的Urlstring类型,并不是 *string, 所以可以正确输出 字符信息。

至于结构体的指针,文档上描述为:

Pointers to structs
Struct fields can be accessed through a struct pointer.

To access the field X of a struct when we have the struct pointer p we
could write (*p).X. However, that notation is cumbersome, so the language permits us instead to write just p.X, without the explicit dereference.

就是说结构体的的字段/方法可以通过指针直接使用,而不用啰嗦的显性写成(*p),这是语言允许的。

fmt.Printf("%p", ticker) // 输出地址,前提是ticker是指针

举个栗子:p,*p,&p来说明一下,
如果p本身是个变量,那么*p是p的指针,&p是p的地址
如果p本身是个指针,那么*p是以p值作为地址指向的地址上的值,&p是p的地址

Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。Go语言的指针,基本上只剩下用于区分 byref 和 byval 语义。
建议别往c语言的指针硬套,golang的指针要好用很多,多写写多尝试很快会掌握。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题