将值传递给函数时,改函数中的每一个更改都不会影响调用方,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函数,系统不会发送值,而是发送变量的内存地址,这就是前面代码在变量左侧带有&符号的原因。