golang函数究竟是值传递还是引用传递?打赏

接上文,踩完php的坑,又遇到golang,golang和之前提到过的Java、JavaScript类似。

在golang中只存在值传递(要么是该值的副本,要么是指针的副本),不存在引用传递。之所以对于引用类型的传递可以修改原内容数据,是因为在底层默认使用该引用类型的指针进行传递,但是也是使用指针的副本,依旧是值传递。

如上,golang的传参形式和Java、JavaScript一致,但又有差别,golang要在声明struct或者变量时用*标识用指针,否则方法内不能修改外部的值。

同样的,举个例子

func main() {
	i:=19
	p:=People{name:"lily",age:&i}
	fmt.Println(p)
	modify(p)
	fmt.Println(p)
}

type People struct {
	name string
	age  *int
}

func (p People) String() string{
	return "name:" + p.name + ",age:"+ strconv.Itoa(*p.age)
}

func modify(p People){
	p.name = "lucy"
	*p.age = 20
}

// 输出结果

// name:lily,age:19
// name:lily,age:20

// 换个角度,modify改为
func modify(p *People){
	p.name = "lucy"
	*p.age = 20
}
// 调用改为
modify(&p)

// 输出结果则为

// name:lily,age:19
// name:lucy,age:20

// 当然,也可以把struct改成这样
func main() {
        n:="lily"
	i:=19
	p:=People{name:&n,age:&i}
	fmt.Println(p)
	modify(p)
	fmt.Println(p)
}

type People struct {
	name *string
	age  *int
}

同上篇,这样看来,似乎也解决了不少问题,但是同样的问题,如果大量在函数内修改结构体内部数据,依然有违函数式编程思想,对此只能说仁者见仁智者见智了,大家根据需求自行选择吧。

golang函数究竟是值传递还是引用传递?
文章《golang函数究竟是值传递还是引用传递?》二维码
  • 微信打赏
  • 支付宝打赏

已有5条评论

  1. 今日新闻

    文章不错非常喜欢,支持一下

    2019-05-21 00:56 回复
  2. 965影视

    965影视: http://www.965ys.net
    博主你好,友链考虑下不?

    2019-05-15 11:43 回复
  3. 蚂蚁乐居

    真心不错,不得不支持一下先!

    2019-05-14 16:23 回复
  4. 天天头条

    文章不错非常喜欢

    2019-05-09 00:14 回复

(必填)

(必填)

(可选)