Go基础知识梳理(二)

Go基础知识梳理(二)

简单函数的定义

//有参数有返回值
func sum(a int, b int) int {
    return a + b
}
//无返回值
func sum(a int, b int) {}
//无参数无返回值
func sum(){}
//返回多个值
func sum(a int, b int) (int, error) {
    return a+b, nil
}
//参数简写(类型相同)
func sum(a, b int) int {
    return a + b
}

匿名函数的定义

func main() {
    //定义一个匿名函数sum
    sum := func(a, b int) int {
        return a + b
    }
    
    res := sum(1 + 2)
    fmt.Println(res) // 3
}

defer关键字

//defer 语句会在return后执行,并且是栈原理,先注册就先入栈,最后执行

func main() {
	print := func(a string) {
		fmt.Println(a)
	}
	defer print("First")
	defer print("Second")

	return
}
打印结果
Second
First

func main() {
    a := 0
    print := func(a int) {
    	fmt.Println(a)
    }
    defer print(a)
    a += 1
}
打印结果
0 //因为defer语句先注册,已经获取到了该变量的副本

//另一种情况
func main() {
	a := 0
	print := func(a *int) {
		fmt.Println(*a)
	}
	defer print(&a)
	a += 1

	return
}
打印结果
1 //因为获取到的是a变量的内存地址

Error错误

//在多个返回值的函数中,error通常放在最后一位进行返回
func sum(a, b int) (int, error) {
   return a + b, errors.New("fail")
}
//对于处理有err返回的,应先用if处理
func main() {
   a := "1"
   b, err := strconv.Atoi(a)
   if err != nil {
       return
   }
   fmt.Println(b)
}
//defer 吾句应该放到四判断的后面,不然有可能产生 panic
//正确写法
func sql() {
   SQL := "SELECT * FROM test"
   stmt, err := self.Conn.Prepare(SQL)
   if err != nil {
   	logger.Logln(logger.ERROR, err)
   	return false
   }
   defer stmt.Close()
}
//错误写法
func sql() {
   SQL := "SELECT * FROM test"
   stmt, err := self.Conn.Prepare(SQL)
   defer stmt.Close() //updated
   if err != nil {
   	logger.Logln(logger.ERROR, err)
   	return false
   }
   //defer stmt.Close()
}

分享文章:Go基础知识梳理(二)
文章起源:http://myzitong.com/article/dsoisjs.html