MST

星途 面试题库

面试题:Go语言中Gopanic的常见使用场景及示例

请阐述Go语言中`panic`的常见使用场景,并分别给出相应的代码示例,要求示例能清晰展示该场景下`panic`的作用和效果。
12.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 访问越界场景
    • 场景阐述:当对数组、切片等进行越界访问操作时,通常可以使用panic来中断程序执行并给出错误提示,因为这种越界访问往往会导致未定义行为。
    • 代码示例
package main

import "fmt"

func main() {
    var arr [5]int
    index := 10
    if index >= len(arr) || index < 0 {
        panic(fmt.Sprintf("数组越界,当前索引 %d 超出范围 [0, %d]", index, len(arr)-1))
    }
    arr[index] = 100
}

在上述代码中,index被设置为10,超出了数组arr的范围,通过panic抛出错误,程序会中断执行并打印出错误信息。

  1. 空指针引用场景
    • 场景阐述:当试图对一个空指针进行解引用或调用其方法时,这会导致运行时错误,使用panic可以及时发现并处理这种情况。
    • 代码示例
package main

import "fmt"

type Person struct {
    Name string
}

func (p *Person) PrintName() {
    if p == nil {
        panic("空指针引用,无法调用 PrintName 方法")
    }
    fmt.Println(p.Name)
}

func main() {
    var person *Person
    person.PrintName()
}

在这个例子中,person是一个空指针,当调用PrintName方法时,通过panic抛出错误,防止程序继续执行导致更严重的问题。

  1. 未预期的逻辑错误场景
    • 场景阐述:在程序逻辑中,如果出现了不应该发生的情况,例如一个switch语句没有匹配到任何预期的case,可以使用panic来表示这是一个未预期的逻辑错误。
    • 代码示例
package main

import "fmt"

func calculate(op string, a, b int) int {
    switch op {
    case "+":
        return a + b
    case "-":
        return a - b
    default:
        panic(fmt.Sprintf("未预期的操作符 %s", op))
    }
}

func main() {
    result := calculate("*", 1, 2)
    fmt.Println(result)
}

这里calculate函数处理+-操作,当传入*这个未预期的操作符时,panic抛出错误,提示出现了未预期的逻辑情况。