MST

星途 面试题库

面试题:Go函数定义的创新思路之参数传递

在Go语言中,基于Go函数定义的创新思路,谈谈值传递和指针传递在函数参数传递中的特点与应用场景,并且编写一个示例函数,分别展示这两种传递方式对函数外部变量的影响。
25.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

值传递和指针传递特点与应用场景

  1. 值传递
    • 特点:在值传递时,函数接收的是实参值的副本。对形参的修改不会影响到函数外部的实参。
    • 应用场景:当传递的数据量较小,且函数内部不需要修改调用者传入的原始数据时,使用值传递。这样可以避免不必要的指针操作带来的复杂性,提高代码的可读性。例如,在对基本数据类型(如 intfloatstring 等)进行传递时,值传递简单直接。
  2. 指针传递
    • 特点:指针传递时,函数接收的是实参的内存地址。通过该地址,函数可以直接修改函数外部的实参值。
    • 应用场景:当需要在函数内部修改调用者传入的数据,或者传递的数据量较大时,使用指针传递可以避免数据的大量拷贝,提高效率。例如,在操作大型结构体时,使用指针传递可以减少内存开销。

示例代码

package main

import "fmt"

// 值传递函数
func valuePass(num int) {
    num = num * 2
    fmt.Printf("值传递函数内 num 的值: %d\n", num)
}

// 指针传递函数
func pointerPass(num *int) {
    *num = *num * 2
    fmt.Printf("指针传递函数内 num 指针指向的值: %d\n", *num)
}

你可以使用以下方式调用这两个函数:

func main() {
    num := 10
    fmt.Printf("初始 num 的值: %d\n", num)

    valuePass(num)
    fmt.Printf("值传递后 num 的值: %d\n", num)

    pointerPass(&num)
    fmt.Printf("指针传递后 num 的值: %d\n", num)
}

在上述代码中,valuePass 函数使用值传递,函数内部对 num 的修改不会影响到外部的 num。而 pointerPass 函数使用指针传递,函数内部通过指针修改了外部 num 的值。