面试题答案
一键面试在Go语言中,切片的零值是 nil
。
函数参数传递时切片零值的默认行为
package main
import "fmt"
func modifySlice(s []int) {
s = append(s, 1)
fmt.Println("Inside function:", s)
}
func main() {
var s []int
fmt.Println("Before function call:", s)
modifySlice(s)
fmt.Println("After function call:", s)
}
在上述代码中,定义了一个 modifySlice
函数,它接受一个 int
类型的切片作为参数。在 main
函数中,声明了一个零值切片 s
并传入 modifySlice
函数。在 modifySlice
函数内对切片进行了 append
操作,但是在 main
函数中再次打印切片 s
时,发现其并未改变。这是因为Go语言函数参数传递是值传递,虽然切片本身是引用类型,但这里传递的是切片的副本,副本的修改不会影响原切片。
初始化时切片零值的默认行为
package main
import "fmt"
func main() {
var s []int
fmt.Println(len(s))
// fmt.Println(s[0]) // 这行代码会引发运行时错误,因为切片零值长度为0,没有元素
}
在上述代码中,声明了一个零值切片 s
,使用 len
函数可以得到其长度为 0
。如果尝试访问零值切片的元素,比如 s[0]
,就会引发运行时错误,因为零值切片没有任何元素。
正确处理切片零值以避免潜在的运行时错误
- 初始化切片:
在使用切片前,可以使用
make
函数或者字面量初始化切片。
// 使用make函数初始化
s1 := make([]int, 5)
// 使用字面量初始化
s2 := []int{1, 2, 3}
- 检查切片是否为零值:
在使用切片前,先检查切片是否为
nil
。
func processSlice(s []int) {
if s == nil {
s = make([]int, 0)
}
// 这里可以安全地对切片进行操作
s = append(s, 1)
fmt.Println(s)
}
通过这种方式,可以避免因切片为零值而引发的运行时错误,确保程序的健壮性。