MST

星途 面试题库

面试题:Go函数参数传递机制

在Go语言中,函数参数传递是值传递还是引用传递?请举例说明不同类型(如基本类型、切片、map)在函数参数传递时的具体表现。
32.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,函数参数传递是值传递。

  1. 基本类型
package main

import "fmt"

func changeNum(num int) {
    num = num + 1
    fmt.Println("函数内 num:", num)
}

func main() {
    num := 10
    changeNum(num)
    fmt.Println("函数外 num:", num)
}

输出:

函数内 num: 11
函数外 num: 10

对于基本类型,传递的是值的副本,在函数内修改副本不会影响原始值。

  1. 切片
package main

import "fmt"

func changeSlice(s []int) {
    s[0] = s[0] + 1
    fmt.Println("函数内切片:", s)
}

func main() {
    s := []int{1, 2, 3}
    changeSlice(s)
    fmt.Println("函数外切片:", s)
}

输出:

函数内切片: [2 2 3]
函数外切片: [2 2 3]

虽然Go语言参数传递是值传递,但切片内部结构包含指向底层数组的指针。当切片作为参数传递时,传递的是切片结构体的副本,该副本中的指针仍指向原来的底层数组,所以在函数内修改切片元素会影响原始切片。

  1. map
package main

import "fmt"

func changeMap(m map[string]int) {
    m["key"] = m["key"] + 1
    fmt.Println("函数内 map:", m)
}

func main() {
    m := map[string]int{"key": 1}
    changeMap(m)
    fmt.Println("函数外 map:", m)
}

输出:

函数内 map: map[key:2]
函数外 map: map[key:2]

map 与切片类似,虽然是值传递,但传递的是map结构体的副本,其内部指针指向底层数据结构,所以在函数内修改map会影响原始map。