Golang 教程5——函数02(时间函数、内建函数、错误机制)

Golang 教程5------函数02 (时间函数、内建函数、错误机制)

注意,该文档只适合有编程基础的同学,这里的go教程只给出有区别的知识点

1、日期和时间函数
1.1 main文件
go 复制代码
func main() {
	//获取当前时间
	now := time.Now()

	//Now() 返回值是一个结构体,类型是 time.Time
	fmt.Printf("当前时间:%v, \n对应的类型:%T", now, now)

	//可格式化时间 数字是固定的,格式可以变 比如2006/01/02 15/04/05
	fmt.Println(now.Format("2006-01-02 15:04:05")) 

	//调用结果体的方法
	fmt.Println("年:",  now.Year(),  " 月:",  now.Month(),  " 日:", now.Day())
	fmt.Println("时:",  now.Hour(),  " 分:",  now.Minute(),  " 秒:", now.Second())
	//其中,这个月份可以转化成数字
	fmt.Println ("月:",  int(now.Month()))
}
1.2 输出结果
go 复制代码
(base) PS E:\Goproject\src\gocode\testproject01> go run ./main/main.go
当前时间:2024-08-23 15:36:12.3137572 +0800 CST m=+0.000000001, 
对应的类型:time.Time2024-08-23 15:36:12
年: 2024  月: August  日: 23
时: 15  分: 36  秒: 12
月: 8
2. 内建函数

golang设计者为了编程方面设计了这些函数

2.1 new函数,new分配内存,new函数的实参是一个类型而不是一个具体的值, new函数的返回值是该内存的地址(指针)
go 复制代码
import (
	"fmt"
)
func main() {
	ptr := new(int)
	fmt.Printf("ptr的类型:%T\nptr的值:%v\nptr指向的值:%v\nptr的地址:%v\n", ptr, ptr, *ptr, &ptr)
}
2.2 输出结果
go 复制代码
(base) PS E:\Goproject\src\gocode\testproject01> go run ./main/main.go
ptr的类型:*int
ptr的值:0xc00010c098
ptr指向的值:0
ptr的地址:0xc000110048
3. 错误处理机制
3.1 main函数
go 复制代码
func main() {
	num1 := 10
	num2 := 0
	res := num1 / num2;
	fmt.Println(res)
}
3.2 输出结果
go 复制代码
(base) PS E:\Goproject\src\gocode\testproject01> go run ./main/main.go
panic: runtime error: integer divide by zero

goroutine 1 [running]:
main.main()
        E:/Goproject/src/gocode/testproject01/main/main.go:10 +0x9
exit status 2
// 从结果可以看出,程序会将函数错误的原因输出,并将出错的位置指出, 发生错误后,程序会被中断,无法继续执行
3.3 如果想让函数继续执行 可以使用 defer + recover 机制进行处理
go 复制代码
func test () {
	defer func() {
		//调用recover(), 可以捕获错误:
		err := recover()
		//如果没有捕获错误,返回值为零值:nil
		if err != nil {
			fmt.Println("捕获到错误:", err)
		}
	}()
	num1 := 10
	num2 := 0
	res := num1 / num2;
	fmt.Println(res)
	
}
func main() {
	test();
	fmt.Println("程序继续运行...")
}
3.4 输出结果
go 复制代码
(base) PS E:\Goproject\src\gocode\testproject01> go run ./main/main.go
捕获到错误: runtime error: integer divide by zero
程序继续运行...
//优点 :提高程序健壮性
3.5 go支持自定义错误
go 复制代码
import (
	"fmt"
	"errors"
)

func test () (err error){
	num1 := 10
	num2 := 0
	if num2 == 0 {
        //如果想让程序直接停掉 panic(errors.New("除数不能为0"))
		return errors.New("除数不能为0")
	} else {
		res := num1 / num2;
		fmt.Println(res)
		return nil
	}
}
func main() {
	err := test();
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("程序继续运行...")
}
3.6 自定义错误
go 复制代码
(base) PS E:\Goproject\src\gocode\testproject01> go run ./main/main.go
除数不能为0
程序继续运行...
相关推荐
microrain18 小时前
从监控孤岛到视联一体:SagooIoT视频监控中心的设计实践
物联网·golang·开源·sagooiot
GoFly开发者1 天前
GoFly 社区 GMQT|国产自研 MQTT‑Broker,打造私有化物联网消息底座
物联网·mqtt·golang·mqtt broker·mqtt私有化部署
刘步权1 天前
KY-RTI分布仿真技术:第十四章 Go程序设计
golang·hla·rti·高层体系结构·多语言仿真
microrain1 天前
从数据烟囱到融合中心:SagooIoT统一数据处理平台的设计实践
物联网·golang·开源·sagooiot
DLYSB_2 天前
API 网关流量洪峰与突发 CC 攻击:我用 Go 写了个“现场物理防御哨兵”,把故障响应压缩到秒级
开发语言·后端·golang·报警灯
朋克洛德的码农2 天前
反射是什么?
golang
北冥you鱼3 天前
Go语言大数(big.Int)比较大小:原理、方法与最佳实践
开发语言·后端·golang
xcLeigh3 天前
Go入门:零值与变量默认初始化机制
开发语言·后端·golang
DLYSB_3 天前
数据库连接池爆满导致全线宕机:我用 Go 写了个“现场声光报警器”,比钉钉快了 10 倍
数据库·golang·钉钉·报警灯