MST

星途 面试题库

面试题:Go语言中常见的触发panic的条件有哪些

请列举至少3种在Go语言编程过程中会触发panic的常见情况,并简单说明原因。
19.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 数组或切片越界
    • 原因:Go语言对数组和切片的访问进行严格的边界检查。当使用超出其有效索引范围的索引访问数组或切片元素时,就会触发panic。例如,一个长度为5的切片,使用索引5或更大的值访问时就会越界。示例代码如下:
package main

import "fmt"

func main() {
    s := make([]int, 5)
    fmt.Println(s[5]) // 这里会触发panic,因为索引5超出了切片的有效范围(0到4)
}
  1. 空指针引用
    • 原因:如果一个指针为nil,而对其指向的内容进行解引用操作,就会触发panic。因为nil指针不指向任何有效的内存地址,无法进行取值等操作。例如:
package main

import "fmt"

func main() {
    var p *int
    fmt.Println(*p) // 这里会触发panic,因为p是nil指针
}
  1. 使用未初始化的接口值调用方法
    • 原因:接口值由两部分组成:动态类型和动态值。如果接口值未初始化(即动态类型和动态值都为nil),调用其方法时会触发panic。例如:
package main

import "fmt"

type Animal interface {
    Speak() string
}

func main() {
    var a Animal
    fmt.Println(a.Speak()) // 这里会触发panic,因为a未初始化
}
  1. 映射(map)操作错误
    • 原因
      • 未初始化map使用:如果使用未初始化的map进行赋值操作,会触发panic。因为未初始化的map没有分配内存空间来存储键值对。例如:
package main

import "fmt"

func main() {
    var m map[string]int
    m["key"] = 1 // 这里会触发panic,因为m未初始化
}
 - **删除不存在的键**:虽然删除不存在的键在Go语言的map中不会触发`panic`,但是如果基于删除操作的结果进行一些假设性的后续操作,而这些假设不成立时可能间接导致`panic`。比如错误地假设删除一个键后map长度一定会减1,如果删除的是不存在的键,这种假设就不成立,在后续依赖该长度变化的操作中可能导致`panic`。

5. 除数为零

  • 原因:在数学运算中,除以零是没有意义的操作,Go语言中当进行整数除法且除数为零时会触发panic。例如:
package main

import "fmt"

func main() {
    result := 10 / 0 // 这里会触发panic,因为除数为零
    fmt.Println(result)
}