程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

Go语言零到一:传递参数(go函数传值)

balukai 2025-07-14 14:50:08 文章精选 2 ℃

引言

在 Go 语言中,函数可以通过参数传递数据。理解参数是如何传递的对于编写正确的程序至关重要。

1. 值传递

  • 基本类型参数
    • 当你将基本类型(如 int, float64, string 等)作为参数传递给函数时,实际上是在函数内部创建了一个该值的副本。
    • 修改函数内的参数不会影响原始值。
    • 示例:
func increment(x int) int {
 x++
 return x
}

func main() {
 var x int = 10
 x = increment(x)
 fmt.Println("Value after increment:", x)
}
  • 复合类型参数
    • 当你将复合类型(如数组、切片、映射、结构体等)作为参数传递给函数时,也会创建一个值的副本。
    • 但是,对于切片、映射和通道,传递的是指向这些数据结构的引用,因此可以在函数内部修改这些数据结构。
    • 示例:
func appendElement(slice []int, element int) []int {
 return append(slice, element)
}

func main() {
 var s []int = []int{1, 2, 3}
 s = appendElement(s, 4)
 fmt.Println("Slice after appending:", s)
}

2. 引用传递

  • 指针参数
    • 为了修改复合类型的原始值,你可以传递指向这些类型的指针。
    • 示例:
func incrementPointer(x *int) {
 *x++
}

func main() {
 var x int = 10
 incrementPointer(&x)
 fmt.Println("Value after increment (using pointer):", x)
}
  • 结构体指针
    • 当你需要修改结构体的字段时,也可以传递结构体的指针。
    • 示例:
type Person struct {
 Name string
 Age int
}

func updateAge(p *Person) {
 p.Age++
}

func main() {
 p := &Person{"Alice", 30}
 updateAge(p)
 fmt.Println("Age after update:", p.Age)
}

3. 可变参数

  • 可变参数
    • 使用 ... 符号可以定义接受可变数量参数的函数。
    • 在函数内部,这些参数会被收集到一个切片中。
    • 示例:
func sum(numbers ...int) int {
 total := 0
 for _, number := range numbers {
 total += number
 }
 return total
}

func main() {
 result := sum(1, 2, 3, 4, 5)
 fmt.Println("Sum:", result)
}

4. 示例代码

package main

import (
  "fmt"
)

// 值传递示例
func increment(x int) int {
  x++
  return x
}

// 切片参数示例
func appendElement(slice []int, element int) []int {
  return append(slice, element)
}

// 指针参数示例
func incrementPointer(x *int) {
  *x++
}

// 结构体指针示例
type Person struct {
  Name string
  Age  int
}

func updateAge(p *Person) {
  p.Age++
}

// 可变参数示例
func sum(numbers ...int) int {
  total := 0
  for _, number := range numbers {
    total += number
  }
  return total
}

func main() {
  // 值传递
  var x int = 10
  x = increment(x)
  fmt.Println("Value after increment:", x)

  // 切片参数
  var s []int = []int{1, 2, 3}
  s = appendElement(s, 4)
  fmt.Println("Slice after appending:", s)

  // 指针参数
  incrementPointer(&x)
  fmt.Println("Value after increment (using pointer):", x)

  // 结构体指针
  p := &Person{"Alice", 30}
  updateAge(p)
  fmt.Println("Age after update:", p.Age)

  // 可变参数
  result := sum(1, 2, 3, 4, 5)
  fmt.Println("Sum:", result)
}

Tags:

最近发表
标签列表