关于go:go语言中会发生panic的情况

4次阅读

共计 1016 个字符,预计需要花费 3 分钟才能阅读完成。

切片越界

func main() {
    // 捕捉异样
    defer func() {if err := recover(); err != nil {fmt.Println(err)
        }
    }()
    //panic 1. 切片越界, 上面的会 panic!
    arr := make([]int, 2)
    arr[2] = 5
    fmt.Println(arr)
}

运行后果

runtime error: index out of range [2] with length 2

反复敞开 chan

func main() {
    //2. 反复敞开 chan
    c := make(chan int)
    close(c)
    close(c)
}

运行后果

panic: close of closed channel

曾经敞开的 chan 持续发送

func main() {
    //3. 曾经敞开的 chan 持续发送数据
    d := make(chan int)
    close(d)
    d <- 1
}

运行后果

panic: send on closed channel

空指针的状况, 定义的指针变量没有初始化, 就间接应用

func main() {
    //4. 空指针的状况, 定义的指针变量没有初始化, 就间接应用
    var p *people
    fmt.Println(p.printName)
}
type people struct {
    Name string
    Age  int
}

func (p people) printName() {fmt.Println(p.Name)
}

运行后果

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x12cb491]

定义的 map 没有初始化就间接应用

func main(){
//5. map 没有初始化间接应用
    var m map[int]string
    m[0] = "111"
}

运行后果

panic: assignment to entry in nil map

常见的谬误然而不是 panic 的状况

数组越界 在程序运行就爆红了

多个 groutine 读写 map

func main() {
    // 多个 groutine 读写 map, 产生 fatal error: concurrent map writes,而不是 panic
    m := make(map[int]string)
    go func() {m[1] = "111"
    }()
    go func() {m[1] = "111"
    }()
    fmt.Println(m)

运行后果

fatal error: concurrent map writes
正文完
 0