新手问题 go语言结构体为什么不是引用类型?

erYue · 2019年09月05日 · 最后由 isoft_dier 回复于 2019年09月07日 · 239 次阅读

今天学习到结构体,一切都好好的,然后到数据类型这里,结构体竟然是值传递?不是引用类型? 这种设计的理由是什么?

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

结构体可以是值传递也可以是引用传递,看兄弟这问法,是从 java 过来的吧。go 中的 “*结构体” 就是传递结构体的指针,可以修改结构体内的字段,而只传结构体本身的话就是值传递,是无法修改结构体的字段的

package main

import "fmt"

type A struct { name string age int }

func (a A) nopoint() { a.name = "no_point" }

func (a *A) havepoint() { a.name = "have_point" }

func main() {

a := &A{ name: "emmm", age: 18, } a.nopoint() fmt.Println(a.name) a.havepoint() fmt.Println(a.name) } 可以参考以上代码

Go 里面默认都是值传递,只有你需要的时候用引用传递。这样很好区分,没有太多潜规则。

其实 Go 的概念更简单,一致性更强:

  • 所有变量 (包括参数, 结构体成员),都是值
  • 指针变量也是值,只是值的内容是另一个变量的地址

https://golang.org/ref/spec#Variables

比较 Python:

  • 所有变量都是 (引用) 对象
  • 不给一些内置类型 (integer, boolean, tuple, etc.) 定义修改操作,(偷偷) 在实现层面把这些对象变成只读的值类型 (immutable)

https://docs.python.org/3/reference/datamodel.html

根据你的需要选择值还是指针

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册