将值传递给函数时,改函数中的每一个更改都不会影响调用方,go是按值传递的编程语言,这意味着每次向函数传递值时,go都会使用该值并创建本地副本,内存中的新变量,在函数中对该变量所做的更改都不会影响你向函数发送的更改。就是开辟了新的内存空间。
例如,假设你创建了一个用于更新人员姓名的函数
package main
func main(){
firstName := "john"
updateName(firestname)
fmt.println(firstName)
}
func updateName(name string) {
name = "david"
}
即使你在函数内将改名称更改为david,输出仍未john。由于uodataName函数中的更改仅会修改本地副本,因为输出不会发生改变,go传递变量的值,而不是变量本身
如果你希望在updateName函数中进行的更改会影响main函数中的firstName变量,则需要使用指针。指针是包含另一个变量的内存地址的变量。当你发送指向某个函数的指针时,不会传递值,而是传递内存地址。因此对该变量所做的每个更改都会影响调用方。
go中,有两个运算符可用于处理指针
& 运算符使用其后对象的地址
* 运算符取消引用指针,也就是说,你可以前往指针中包含的地址访问其中的对象
package main
func main(){
firstName := "john"
updateName(&firstName)
fmt.println(fristName)
}
func updateName( name *string) {
*name = "david"
}
首先要做的就是修改函数的签名,以指明你要接收指针,将参数类型从string更改为*string,后者仍是字符串,但是现在他是指向字符串的指针。然后,将新值分配给改变量时,需要在改变量的左侧添加* 以暂停改变量的值。调用updateName函数,系统不会发送值,而是发送变量的内存地址,这就是前面代码在变量左侧带有&符号的原因。