面试题答案
一键面试值传递
- 表现形式:在Go语言中,值传递是指在函数调用时,将实际参数的值复制一份传递给函数的形式参数。函数内部对形式参数的修改不会影响到实际参数。
- 示例:
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
的值并未改变。
引用传递
- 表现形式:Go语言中没有传统意义上像C++那样的引用传递方式,但可以通过指针来模拟引用传递。当传递指针时,传递的是变量的内存地址,函数内部通过指针可以直接修改实际参数的值。
- 示例:
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
值也随之改变。
不同影响
- 值传递:
- 适用场景:当函数不需要修改传入的参数值,或者参数本身是简单类型(如
int
、float
、bool
等)且数据量较小时,使用值传递更简单直观,并且可以避免因意外修改参数值带来的错误。 - 影响:值传递会复制参数的值,如果参数是较大的结构体等复杂类型,会占用额外的内存空间,在性能上可能有一定损耗。
- 适用场景:当函数不需要修改传入的参数值,或者参数本身是简单类型(如
- 引用传递(通过指针模拟):
- 适用场景:当函数需要修改传入的参数值,或者参数是较大的结构体等复杂类型,为了避免大量的数据复制提高性能时,使用指针传递。
- 影响:通过指针传递可以直接修改实际参数,但同时也增加了程序的复杂性,因为指针操作需要更小心,否则容易导致空指针引用等错误。