持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
一、简介
1.1 常用内置函数
- len:用来求长度,例如 string,array,slice,map,channel
- new:用来分配内存,主要用来分配值类型,比如int,float32,struct... 返回的是指针
- make: 用来分配内存,主要用来分配引用类型,如 chan,map,slice
1.2 案例演示
package main
import "fmt"
func main() {
num1 := 100
// num1 = 100, num1 Type = int, 地址 = 0xc000012098
fmt.Printf("num1 = %v, num1 Type = %T, 地址 = %v\n", num1, num1, &num1)
num2 := new(int)
// num2 = 0xc0000120b8 (系统分配), num2 Type = *int, 地址 = 0xc000006030, num2指针的值为 = 0
// 此时 0xc000006030 是 值为0的地址
fmt.Printf("num2 = %v, num2 Type = %T, 地址 = %v, num2指针的值为 = %v\n", num2, num2, &num2, *num2)
// 修改num2值
*num2 = 100
// 修改后的num2指针的值 = 100
fmt.Printf("修改后的num2指针的值 = %v\n", *num2)
}
二、错误处理
2.1 为何需要处理错误
- 在默认情况下,发生错误后(panic),程序会自动退出(崩溃)
- 若想在发生错误后捕获到错误,并进行处理,保证程序继续运行。或在捕获到错误后,给个管理员提示(邮件)
2.2 go的错误处理
- Go语言追求简洁,Go不支持传统的 try....catch......finally。
- Go中引入的处理方式为: defer, panic, recover
- Go中抛出一个panic异常,然后在defer中通过recover捕获,然后正常处理
- 进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮。
2.3 案例演示
package main
import (
"fmt"
)
func test() {
// 使用defer + recover捕获和处理异常
defer func() {
err := recover() // recover是内置函数,可以捕获到异常
// 语法2 -- > if err := recover();err != nil{}
if err != nil { // 如果捕获到错误
fmt.Println("err = ", err)
// 将错误信息发送给管理员
fmt.Println("发生错误...............")
}
}()
num1 := 10
num2 := 0
result := num1 / num2
fmt.Println("result = ", result)
}
func main() {
test()
// err = runtime error: integer divide by zero
// test函数运行成功......
fmt.Println("test函数运行成功......")
}
2.4 自定义错误
Go程序中,也支持自定义错误,使用errors.New和Ppanic内置函数。
- errors.New(" 错误说明") ,会返回一个error类型的值,表示- -个错误
- panic内置 函数,接收- -个interface{}类型的值(也就是任何值了)作为参数。可以接收error类型的变量,输出错误信息,并退出程序.
2.5 自定义错误案例
package main
import (
"errors"
"fmt"
)
// 函数读取配置文件 init.conf 信息
// 若文件名传入错误,则返回一个自定义错误
func readConf(name string) (er error) {
if name == "config.ini" {
// 读取文件
return nil
} else {
// 返回自定义错误
return errors.New("读取文件错误")
}
}
func test2() {
err := readConf("config.ini")
if err != nil {
// 如果读取文件发生错误,就输出错误,终止程序
panic(err)
}
fmt.Println("test2 后面的代码继续执行")
}
func main() {
test2()
// test2 后面的代码继续执行
// main函数......
fmt.Println("main函数......")
}