【一Go到底】第二十五天---内置函数和Go错误机制

114 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

一、简介

1.1 常用内置函数

  1. len:用来求长度,例如 string,array,slice,map,channel
  2. new:用来分配内存,主要用来分配值类型,比如int,float32,struct... 返回的是指针
  3. 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 为何需要处理错误

  1. 在默认情况下,发生错误后(panic),程序会自动退出(崩溃)
  2. 若想在发生错误后捕获到错误,并进行处理,保证程序继续运行。或在捕获到错误后,给个管理员提示(邮件)

2.2 go的错误处理

  1. Go语言追求简洁,Go不支持传统的 try....catch......finally。
  2. Go中引入的处理方式为: defer, panic, recover
  3. Go中抛出一个panic异常,然后在defer中通过recover捕获,然后正常处理
  4. 进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮。

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内置函数。

  1. errors.New(" 错误说明") ,会返回一个error类型的值,表示- -个错误
  2. 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函数......")
}