error接口

package main

import (
	"fmt"
	"errors"
)

func dive(a int, b int) (value int, err error) {
	if b == 0 {
		err = errors.New("除数不能为0")
		return
	}
	value = a / b
	return
}
func main() {

	a := 10
	b := 5
	value, err := dive(a, b)

	if err != nil {
		fmt.Println("runtime error:",err)
	} else {
		fmt.Println(value)

	}

}

panic异常

package main

import "fmt"

func test(i int){
	var arr [10]int

	//panic("runtime error: index out of range")
	arr[i]=123

	fmt.Println(arr)
}

func main() {

	test(10)

	//fmt.Println("hello world1")
	//fmt.Println("hello world2")
	////当程序遇见panic是自动终止
	//panic("hello world3")
	//fmt.Println("hello world3")
	//fmt.Println("hello world4")
	//fmt.Println("hello world5")
}

延迟调用defer (根据入栈出栈规则执行)

package main

import "fmt"

func main0301() {

	fmt.Println("GO学习")
	defer fmt.Println("IT行业")
	defer fmt.Println("日薪越亿")
	fmt.Println("轻松就业")
}

func main0302() {
	a := 10
	b := 20

	//func (a int,b int){
	//	fmt.Println(a+b)
	//}(a,b)
	f := func(a int, b int) {
		fmt.Println(a + b)
	}

	//如果在defer 调用时将函数参数先放在内存中 是一个独立的空间  不会因为改变值允许数据
	defer f(a, b)

	a = 123
	b = 321

}

func main() {
	a := 10
	b := 20

	f := func() {
		fmt.Println(a + b)
	}
	//如果不传递参数  使用外部的变量  如果外部变量修改  会影响函数的值
	defer f()

	a = 123
	b = 321
}

recover拦截

package main

import "fmt"

func demo(i int) {

	//错误拦截到出现在错误之前
	defer func() {
		//错误拦截 panic异常错误
		err := recover()
		//判断是否出现错误
		if err != nil {
			fmt.Println(err)
		}

	}()

	var arr [10]int

	var p *int //0x0 nil
	//p = new(int)
	*p = 123

	//数组下标越界
	arr[i] = 123

	fmt.Println(arr)

}
func main() {
	demo(10)

	fmt.Println("hello world")
}