这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
1. 什么是goroutine
- 在Go语言中,每一个并发活动都可以叫做一个goroutine
- 使用go关键字可以创建goroutine
- 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语言中的单元测试
- 如果不引入单元测试的话,那么我们就需要在main函数中调用函数进行测试,这样不仅会破坏程序的结构,而且程序启动后我们也不能修改main函数中的内容,所以引入单元测试是很有必要的,Go语言的单元测试放在了test包下面
- 凡是测试文件go build都不会进行编译
3. 如何使用单元测试
- 首先我们测试文件的命名:被测试的文件名_test.go
- 测试方法的命名:Test被测试的方法名
- 测试方法的参数: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. 系统异常处理
- Go语言不支持try...catch...finally这样的异常处理
- Go语言处理异常的方式:defer,panic,recover
- 通常的应用场景: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()
}