在 Go 语言中,以下情况会引起 panic:
一、除数为零
package main
import "fmt"
func main() {
a := 10
b := 0
fmt.Println(a / b)
}
运行这段代码会引发 panic,因为除数不能为零。
二、索引越界
package main
import "fmt"
func main() {
arr := []int{1, 2, 3}
fmt.Println(arr[3])
}
访问超出数组或切片长度的索引会导致 panic。
三、空指针解引用
package main
import "fmt"
type Person struct {
Name string
}
func main() {
var p *Person
fmt.Println(p.Name)
}
对一个未初始化的指针(空指针)进行解引用操作会引发 panic。
四、发送或接收已关闭的通道数据
package main
import "fmt"
func main() {
ch := make(chan int)
close(ch)
ch <- 10 // 向已关闭的通道发送数据会引发 panic
fmt.Println(<-ch) // 从已关闭的通道接收数据也可能引发 panic,具体取决于接收时机
}
五、类型断言失败
package main
import "fmt"
func main() {
var i interface{} = 10
s := i.(string)
fmt.Println(s)
}
当进行类型断言时,如果实际类型与断言的类型不匹配,会引发 panic。