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

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

已邀请:

LiaoMessi

赞同来自: erYue

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

LiaoMessi

赞同来自: erYue

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)

} 可以参考以上代码

jemygraw - Go爱好者

赞同来自: erYue

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

h12 - https://h12.io/about

赞同来自: erYue

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

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

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

比较Python:

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

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

isoft_dier

赞同来自:

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

要回复问题请先登录注册