2022-4-25 实习Day23 1、新贸金账户行关联表信息配置 –3小时 100% 2、新贸金系统汇出汇款业务手动测试。–3小时 100%
Golang编程学习(part 18) 1、内置函数 Golang设计者为了编程方便,提供了一些函数,这些函数可以直接使用,我们称之为内置函数。 ① len():用来求长度,比如string、array、slice、map、channel ② new():用来分配内存,主要用来分配值类型,比如 int、float32、struct…返回的是指针 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package mainimport "fmt" func main () { num1 := 100 fmt.Printf("num1的类型%T\nnum1的值%v\nnum1的地址%v\n" ,num1, num1, &num1) num2 := new (int ) *num2 = 200 fmt.Printf("num2的类型%T\nnum2的值%v\nnum2的地址%v\n指向的值%v" ,num2, num2, &num2, *num2) }
其实对于new()这个方法很好理解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 func new (Type) *TypeThe new built-in function allocates memory. The first argument is a type , not a value, and the value returned is a pointer to a newly allocated zero value of that type . 翻译过来就是: new ()内置函数是用来分配内存空间。 函数中的参数是一个类型而不是一个值, 并且这个函数所返回的值是一个指针类型,这个指针指向的是所分配的这种类型的0 值 看起来比较抽象,咱们来画图理解,先上一段代码 a := 100 num2 := new (*int ) *num2 = &a fmt.Println(**num2) num2是什么?是*int 类型的指针。 1 、num2中保存[内存地址0x23456 ],num2变量中保存着一个内存地址,并且num2作为变量本身也有内存地址[0x25468 ]2 、num2变量中保存的这个内存地址指向的是一个什么类型的值?是一个*int 类型,所以还是一个指针, 那么我现在*num2解引用后【就是拿到内存地址0x23456 中所存放的值】还是一个地址[0x4825 ] 3 、既然*num2还是一个引用,那我们继续解引用*,**num2后得到的是什么?得到的是一个int 类型的值 num2【0x23456 】---->[0x4825 ]---->[100 ] 物理地址 0x25468 0x23456 0x4825
③ make():用来分配内存,主要用来分配引用类型,比如channel、map、slice。 2、Golang的错误处理 ① 在默认情况下,当发生错误后(panic),程序就会退出(崩溃)【发生错误地方下面的代码就不会执行了】 ② 如果我们希望:当发生错误后,可以捕获到错误并进行处理,保证程序可以继续执行。还可以在捕获到错误后,给管理员一个提示(邮件,短信……) ③ 这里我们引出要讲的错误处理机制 基本说明 ① Go语言追求简介优雅,所以Go不支持传统的try…catch…finally 这种处理方式 ② Go中引入的处理方式为:defer,panic,recover ③ 这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic异常,然后再defer中通过recover捕获这个异常,然后正常处理。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package mainimport ( "fmt" "time" ) func test () { defer func () { err := recover () if err != nil { fmt.Println("err=" , err) } }() num1 := 10 num2 := 0 res := num1 / num2 fmt.Println("res=" , res) } func main () { test() for { fmt.Println("main()下面的代码..." ) time.Sleep(time.Second) } }
④ 这种错误处理机制的好处就是,进行错误处理后程序不会轻易的挂掉,如果加入预警代码,就可以让程序更加的健壮 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 func test () { defer func () { err := recover () if err != nil { fmt.Println("err=" , err) fmt.Println("发送邮件给admin@sohu.com" ) } }() num1 := 10 num2 := 0 res := num1 / num2 fmt.Println("res=" , res) }
3、Golang的自定义错误 Go程序中,也支持自定义错误,使用errors.New 和 panic 内置函数 ① errors.New(“错误说明”),会返回一个error类型的值,表示一个错误 ② panic 内置函数,接收一个interface{}类型的值(也就是任何值)作为参数,可以接收error类型的变量,输出错误信息,并退出程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package mainimport ( "errors" "fmt" ) func readConf (name string ) (err error ) { if name == "config.ini" { return nil } else { return errors.New("读取文件错误..." ) } } func test () { err := readConf("config.ini" ) if err != nil { panic (err) } } func main () { test() fmt.Println("main()下面的代码..." ) }