MST

星途 面试题库

面试题:Go语言函数参数传递机制基础

在Go语言中,函数参数传递主要有值传递和引用传递两种方式,请详细阐述这两种传递方式在Go语言中的表现形式,并举例说明在何种情况下使用值传递和引用传递会对程序产生不同的影响。
33.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

值传递

  1. 表现形式:在Go语言中,值传递是指在函数调用时,将实际参数的值复制一份传递给函数的形式参数。函数内部对形式参数的修改不会影响到实际参数。
  2. 示例
package main

import "fmt"

func modifyValue(num int) {
    num = num + 10
    fmt.Println("函数内部 num 的值:", num)
}

func main() {
    a := 5
    modifyValue(a)
    fmt.Println("函数外部 a 的值:", a)
}

在上述示例中,modifyValue函数接收一个int类型的参数num,在函数内部对num进行修改,但函数外部的变量a的值并未改变。

引用传递

  1. 表现形式:Go语言中没有传统意义上像C++那样的引用传递方式,但可以通过指针来模拟引用传递。当传递指针时,传递的是变量的内存地址,函数内部通过指针可以直接修改实际参数的值。
  2. 示例
package main

import "fmt"

func modifyPointer(num *int) {
    *num = *num + 10
    fmt.Println("函数内部 *num 的值:", *num)
}

func main() {
    a := 5
    modifyPointer(&a)
    fmt.Println("函数外部 a 的值:", a)
}

在这个示例中,modifyPointer函数接收一个int类型的指针num,在函数内部通过解引用指针修改了实际参数a的值,函数外部的a值也随之改变。

不同影响

  1. 值传递
    • 适用场景:当函数不需要修改传入的参数值,或者参数本身是简单类型(如intfloatbool等)且数据量较小时,使用值传递更简单直观,并且可以避免因意外修改参数值带来的错误。
    • 影响:值传递会复制参数的值,如果参数是较大的结构体等复杂类型,会占用额外的内存空间,在性能上可能有一定损耗。
  2. 引用传递(通过指针模拟)
    • 适用场景:当函数需要修改传入的参数值,或者参数是较大的结构体等复杂类型,为了避免大量的数据复制提高性能时,使用指针传递。
    • 影响:通过指针传递可以直接修改实际参数,但同时也增加了程序的复杂性,因为指针操作需要更小心,否则容易导致空指针引用等错误。