面试题答案
一键面试在Go语言中,函数参数传递是值传递。
- 基本类型:
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
对于基本类型,传递的是值的副本,在函数内修改副本不会影响原始值。
- 切片:
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语言参数传递是值传递,但切片内部结构包含指向底层数组的指针。当切片作为参数传递时,传递的是切片结构体的副本,该副本中的指针仍指向原来的底层数组,所以在函数内修改切片元素会影响原始切片。
- 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。