面试题答案
一键面试- 访问越界场景
- 场景阐述:当对数组、切片等进行越界访问操作时,通常可以使用
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
抛出错误,程序会中断执行并打印出错误信息。
- 空指针引用场景
- 场景阐述:当试图对一个空指针进行解引用或调用其方法时,这会导致运行时错误,使用
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
抛出错误,防止程序继续执行导致更严重的问题。
- 未预期的逻辑错误场景
- 场景阐述:在程序逻辑中,如果出现了不应该发生的情况,例如一个
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
抛出错误,提示出现了未预期的逻辑情况。