首页 > 文章列表 > Go语言中的参数传递方式探究

Go语言中的参数传递方式探究

参数传递 go
323 2024-04-23

在 Go 语言中,函数参数的传递方式主要有两种:值传递:传递变量的副本,不会影响调用代码中的原始变量。指针传递:传递变量的地址,允许函数直接修改调用代码中的原始变量。

Go语言中的参数传递方式探究

Go 语言中的参数传递方式探究

在 Go 语言中,函数参数的传递方式主要是值传递。值传递意味着传递给函数的变量的副本,而不是原变量本身。这种机制确保了函数不会意外地修改调用它的代码中的变量。

值传递

值传递使用 = 运算符来创建变量的副本。在下面的代码块中,fum() 函数接受 n 变量的副本作为参数:

func fum(n int) {
  n += 1
}

func main() {
  n := 10
  fum(n)
  fmt.Println(n) // 输出:10
}

即使 fum() 函数增加了 n 的值,main() 函数中 n 的原始值也不会受到影响。

指针传递

在某些情况下,可能需要函数修改调用它的代码中的变量。为了实现这一点,Go 语言提供了一种称为指针传递的机制。指针传递将变量的地址传递给函数,而不是副本。

func fumP(n *int) {
  // 使用 `*n` 间接访问变量
  *n += 1
}

func main() {
  n := 10
  fumP(&n)
  fmt.Println(n) // 输出:11
}

在上面的代码块中,fumP() 函数接收变量 n 的指针作为参数。指针传递允许函数通过解引用指针 (*n) 直接修改 n 变量。

实战案例

考虑以下字符排序函数:

func sortChars(s []rune) {
  // 在值传递的情况下,对 s 的排序不会影响 main 中的原 slice
}

func main() {
  s := []rune("Hello World")
  sortChars(s)
  fmt.Println(s) // 输出:["H", "e", "l", "l", "o", " ", "W", "o", "r", "d"]
}

在这个例子中,sortChars() 函数使用值传递接收 s slice 的副本。因此,对副本的排序不会影响 main() 函数中 s 的原始值。

结论

Go 语言提供值传递和指针传递两种参数传递方式。理解这些方式对于避免意外的变量修改和实现正确的代码行为至关重要。