多线程、常见包以及错误处理 | 青训营笔记

53 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

1. 什么是goroutine

  1. 在Go语言中,每一个并发活动都可以叫做一个goroutine
  2. 使用go关键字可以创建goroutine
  3. go关键字创建线程一般放在函数或者闭包前面
package main

import (
	"fmt"
	"time"
)

func func1() {
	i := 0
	for i <= 10 {
		fmt.Println("fun1():", i)
		i++
	}
}

func func2() {
	i := 0
	for i <= 10 {
		fmt.Println("fun2():", i)
		i++
	}
}

func main() {
	go func1()
	go func2()
	time.Sleep(time.Second * 2)
}

2. Go语言中的单元测试

  1. 如果不引入单元测试的话,那么我们就需要在main函数中调用函数进行测试,这样不仅会破坏程序的结构,而且程序启动后我们也不能修改main函数中的内容,所以引入单元测试是很有必要的,Go语言的单元测试放在了test包下面
  2. 凡是测试文件go build都不会进行编译

3. 如何使用单元测试

  1. 首先我们测试文件的命名:被测试的文件名_test.go
  2. 测试方法的命名:Test被测试的方法名
  3. 测试方法的参数:t *testing.T

4. time

fmt.Printf("%v\n", now.Year())
fmt.Printf("%v\n", now.Month())
fmt.Printf("%v\n", now.Day())
fmt.Printf("%v\n", now.Hour())
fmt.Printf("%v\n", now.Minute())
fmt.Printf("%v\n", now.Second())

// 1. 日期格式化方式一
var now = time.Now()
fmt.Printf("日期,时间:%d-%d-%d %d:%d:%d\n", now.Year(), now.Month(),
		now.Day(), now.Hour(), now.Minute(), now.Second())
// 2. 日期格式化方式二,这个日期必须这么写,好像是Go的诞生时间?
fmt.Println("格式化方式二:", now.Format("2006-01-02 15:04:05"))


// Unix()系列方法
var now = time.Now()  // 不接受任何参数,返回一个Time类对象
fmt.Println(now.Unix())  // Unix()方法返回自1970.1.1 00:00:00至今所经过的秒数
// Unix还有返回毫秒、微秒、纳秒的方法,自行查阅API

5. 系统异常处理

  1. Go语言不支持try...catch...finally这样的异常处理
  2. Go语言处理异常的方式:defer,panic,recover
  3. 通常的应用场景:Go抛出一个panic的异常,然后在defer通过recover()方法捕获异常即可
package main

import (
	"errors"
	"fmt"
	"testing"
)

func test1() {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("发生了错误")
		}
	}()
	num1 := 10
	num2 := 0
	a := num1 / num2
	fmt.Println(a)
	fmt.Println("你好")
}

func readConf(name string) (err error) {
	if name == "init.conf" {
		// ... 执行相应的操作
		return nil // 没有异常的话这个err指针就是nil
	} else {
		return errors.New("配置文件名称有误")
	}
}

func test02() {
	err := readConf("init.conf")
	if err != nil {
		fmt.Println(err)
	}
	// test02()继续执行
	fmt.Println("test02()继续执行!")
}

func TestError(*testing.T) {
	test02()
}