接上文,踩完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函数究竟是值传递还是引用传递?
- 微信打赏
- 支付宝打赏