接上文,踩完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 }
同上篇,这样看来,似乎也解决了不少问题,但是同样的问题,如果大量在函数内修改结构体内部数据,依然有违函数式编程思想,对此只能说仁者见仁智者见智了,大家根据需求自行选择吧。
上一篇: php函数之值传递&引用传递 下一篇: seajs amd 改造