深入理解Go语言中参数传递中的值、引用及指针之间的区别

引言:
在Go语言中,参数传递是一个重要的概念。了解参数传递中值、引用和指针之间的区别对于编写高效、可靠的代码至关重要。本文将详细讲解Go语言中参数传递中值、引用和指针的概念,并提供相应的代码示例和注解。

1. 值传递:

值传递是指在函数调用时,将实际参数的值复制给形式参数。这意味着在函数内部对形式参数的修改不会影响到实际参数的值。

示例代码:

package main

import "fmt"

func modifyValue(x int) {
    
    
    x = 10
}

func main() {
    
    
    num := 5
    modifyValue(num)
    fmt.Println(num) // 输出 5
}

注解:
在上述代码中,我们定义了一个函数modifyValue,该函数接受一个整数参数x。在函数内部,我们将x的值修改为10,但是这个修改不会影响到main函数中的num变量的值。

2. 引用传递:

引用传递是指在函数调用时,将实际参数的引用(地址)传递给形式参数。这意味着在函数内部对形式参数的修改会影响到实际参数的值。

示例代码:

package main

import "fmt"

func modifySlice(s []int) {
    
    
    s[0] = 100
}

func main() {
    
    
    slice := []int{
    
    1, 2, 3, 4, 5}
    modifySlice(slice)
    fmt.Println(slice) // 输出 [100, 2, 3, 4, 5]
}

注解:
在上述代码中,我们定义了一个函数modifySlice,该函数接受一个切片参数s。在函数内部,我们将切片的第一个元素修改为100,这个修改会影响到main函数中的slice切片的值。

3. 指针传递:

指针传递是指在函数调用时,将实际参数的地址传递给形式参数。通过使用指针,我们可以在函数内部直接修改实际参数的值。

示例代码:

package main

import "fmt"

func modifyPointer(x *int) {
    
    
    *x = 10
}

func main() {
    
    
    num := 5
    modifyPointer(&num)
    fmt.Println(num) // 输出 10
}

注解:
在上述代码中,我们定义了一个函数modifyPointer,该函数接受一个整数指针参数x。在函数内部,我们通过解引用指针x并将其赋值为10,这个修改会直接影响到main函数中的num变量的值。

Go语言中参数传递中的值传递和引用传递的类型区别

在Go语言中,参数传递是一个重要的概念。了解哪些类型是值传递,哪些类型是引用传递对于编写高效、可靠的代码至关重要。本文将详细讲解Go语言中参数传递中的值传递和引用传递的类型,并提供相应的代码示例和解释。

1. 值传递的类型:

在Go语言中,以下类型是值传递的:

  • 基本类型:整型、浮点型、布尔型和字符串型等。
  • 数组:包括定长数组和切片。
  • 结构体:包括自定义结构体和匿名结构体。

示例代码:

package main

import "fmt"

func modifyValue(x int, arr [3]int, s []int, person Person) {
    
    
    x = 10
    arr[0] = 100
    s[0] = 1000
    person.Name = "John Doe"
}

type Person struct {
    
    
    Name string
    Age  int
}

func main() {
    
    
    num := 5
    array := [3]int{
    
    1, 2, 3}
    slice := []int{
    
    1, 2, 3}
    person := Person{
    
    Name: "Alice", Age: 25}

    modifyValue(num, array, slice, person)

    fmt.Println(num)    // 输出 5
    fmt.Println(array)  // 输出 [1 2 3]
    fmt.Println(slice)  // 输出 [1000 2 3]
    fmt.Println(person) // 输出 {Alice 25}
}

解释:
在上述代码中,我们定义了一个函数modifyValue,该函数接受一个整型参数x、一个数组参数arr、一个切片参数s和一个结构体参数person。在函数内部,我们分别修改了这些参数的值,但是这些修改并不会影响到main函数中的对应变量的值。

2. 引用传递的类型:

在Go语言中,以下类型是引用传递的:

  • 切片slice:切片是引用类型,传递切片时传递的是底层数组的引用。
  • 字典map:字典也是引用类型,传递字典时传递的是字典的引用。
  • 通道channel
  • 接口 interface
  • 指针:指针类型本身就是引用类型,传递指针时传递的是指针的值(地址)。

示例代码:

package main

import "fmt"

func modifySlice(s []int, m map[string]int, p *Person) {
    
    
    s[0] = 100
    m["key"] = 1000
    p.Name = "John Doe"
}

type Person struct {
    
    
    Name string
    Age  int
}

func main() {
    
    
    slice := []int{
    
    1, 2, 3}
    m := map[string]int{
    
    "key": 10}
    person := &Person{
    
    Name: "Alice", Age: 25}

    modifySlice(slice, m, person)

    fmt.Println(slice)  // 输出 [100 2 3]
    fmt.Println(m)      // 输出 map[key:1000]
    fmt.Println(person) // 输出 &{John Doe 25}
}

解释:
在上述代码中,我们定义了一个函数modifySlice,该函数接受一个切片参数s、一个字典参数m和一个指针参数p。在函数内部,我们通过修改切片、字典和指针指向的结构体的值,这些修改会直接影响到main函数中的对应变量的值。

总结:

通过本文的讲解,我们深入理解了Go语言中参数传递中的值传递和引用传递的类型。基本类型、数组、结构体是值传递的类型,而切片、字典和指针是引用传递的类型。在编写Go代码时,根据需求选择适当的参数传递方式,能够提高代码的性能和可维护性。
我们深入理解了Go语言中参数传递中值、引用和指针之间的区别。值传递是将实际参数的值复制给形式参数,引用传递是将实际参数的引用传递给形式参数,而指针传递是将实际参数的地址传递给形式参数。在编写Go代码时,根据需求选择适当的参数传递方式,能够提高代码的性能和可维护性。

猜你喜欢

转载自blog.csdn.net/weiyi47/article/details/131923769