接上文,踩完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
}

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