• Go之函数与异常


    
    package main
    
    import "fmt"
    // import   "strings"
    
    // 函数接收可变参数
    // 当多个参数是相同类型时,可以只将数据类型写在最后一个参数里面
    func intSum(nums ...int)(sum, len int){
    	// 可变参数在函数体中是切片类型
    	for _, num := range(nums){
    		// 当返回值有变量名时,不需要重新声明
    		sum += num
    	}
    	len = cap(nums)
    	// 函数在即将要结束的时候按照逆序的方式,执行被defer修饰的语句,通常用来处理资源的释放问题
    	defer fmt.Println(999)
    	defer fmt.Println(998)
    	return sum, len
    }
    func main() {
    	// go语言中支持函数、匿名函数和闭包,并且函数
    	// 在go语言中属于“一等公民”	
    	sum, len := intSum(1,2)
    	fmt.Println(sum, len)
    
    	// 函数是可以作为变量的
    	testFunc := intSum
    	fmt.Printf("%T
    ", testFunc)
    
    
    	// 匿名函数
    	// 匿名函数就是没有函数名的函数,匿名函数多用于实现回调函数和闭包
    	func(x int){
    		fmt.Println(x)
    	}(10)
    
    	// 闭包
    	// 闭包指的是一个函数与其相关的引用环境组合而成的实体
    	// 简单来说,闭包=函数+引用环境
    	// funca 此时就是闭包
    	// 判断函数是不是闭包,就要判断函数内部有没有引用外层的作用域的变量
    	funca := a()
    	funca()
    
    	b()
    	// recover()必须搭配defer使用
    	// defer一定要在可能引发painc的语句之前定义
    }
    
    // 把函数作为返回值
    func a() func(){
    	name := "古力娜扎"
    	return func(){
    		fmt.Println(name)
    	}
    }
    
    func b(){
    	// defer注册
    	defer func(){
    		// 收集相关错误信息
    		err := recover()
    		if err != nil{
    			fmt.Println("func b err")
    		}		
    	}()
    
    	// 触发painc
    	panic("painc in b")
    }
    
  • 相关阅读:
    ffmpeg用法
    文本文件存储格式
    一个守护进程实例
    构造函数初始化列表问题
    Windows系统下远程Linux系统
    printStackTrace
    getParameter
    HTML5新增的属性和废除的属性
    oracle导出表结构及注释
    <input type="text" > size与width区别
  • 原文地址:https://www.cnblogs.com/cl94/p/13805947.html
Copyright © 2020-2023  润新知