前言
这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天,其实第五届青训营已经正式开课n多天了,笔记不断更新中,都是我听完课之后的总结和平时自己的学习积累,分享出来给有需要的朋友。
本文内容
本文主要讲解了六个知识点,包括Go中修改全局变量、给类型取别名、对函数返回值命名、初始化函数、defer关键字以及GO语言错误处理方法等内容。
一、Go语言基础
1.修改全局变量
(1) 在Go中函数内变量能直接修改全局变量的值
var kk int = 10
func exp1() {
fmt.Println("函数内kk修改之前的值为:", kk)
kk = 15
}
(2) 值传递不影响外面的变量值(非全局变量)
// 主函数内被调用
func test1(n int) {
//属于值传递,不影响外面的n的值
n = 20
fmt.Println("里面n的值为:", n)
}
(3) 若是想修改外面的值,可以使用引用传递,传变量的地址
func test2(n *int) {
// 传进来的是地址,所以会改变外面的n的值
*n = 20
fmt.Println("里面n的值为:", *n)
}
2.给类型取别名
在Go中可以给类型取别名
func asname() {
//给int取别名为myInt
type myInt int
var num1 myInt = 10
fmt.Printf("num1=%v,类型为%T\n", num1, num1)
// 但是要注意,虽然myInt 和 int都是int类型,但是go认为它们是不同的两个类型
//上面显示的num1类型是main.myInt
// 不能像下面这样传值,会报错
//var num2 int=num1
}
还有一种用法 可以给函数取别名,这样在传入一个函数的时候就方便了
type funtype func(int, int) int
func myfun(funvar funtype, num1 int, num2 int) {
return funvar(num1, num2)
}
上面代替了下面这个
func myfun(funvar func(int, int) int,num1 int,num2 int){
return funvar(num1,num2)
}
3.对函数返回值命名
func getSumAndSub(n1 int, n2 int) (sum int, sub int) {
sum = n1 + n2
sub = n1 - n2
return //直接return就好了,已经定义好了返回值sum sub
}
4.初始化函数
init函数可以用来初始化工作,通常会比main函数先一步执行。为了看得全局变量了是先被初始化的,这里我们先写函数
var msg = test()
// 第一个执行
func test() string {
fmt.Println("这是全局变量定义,最先执行")
return "这是全局变量定义"
}
// 第二个执行
// 初始化函数init ,会在main函数之前执行
func init() {
println("我是init函数,比main函数先执行")
}
// main函数会最后执行
func main() {
fmt.Println("我是主函数,执行顺序是最后")
}
如果一个文件中同时包含全局变量定义、init函数和main函数,则执行的流程是全局变量->init函数->main函数
5.defer关键字
(1)defer简介
defer 关键字让代码可以在延迟在最后执行,主要原理就先压进栈,然后出栈,因为先进后出所以它会在下面其他代码执行完后再输出
(2)defer关键字作用
主要用于数据库连接关闭、文件存取关闭等关闭资源等操作。
(3)基本用法
func test(n int) {
defer fmt.Println("defer1 n的值是:", n) //先进后出
n++
fmt.Println("1.n的值是:", n)
}
func main() {
test(10) //defer最后执行
}
如果defer后面有修改变量的值,defer输出的值不会改变,因为已经压入栈了,不会改变栈中值。相当于暂时先把输出冻结了。
6.Go语言错误处理
go中处理异常引入了defer,panic,recover等关键字。
(1)使用defer和recover处理
其中go可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理
func test2() {
// 使用defer+recover来捕获和处理异常
defer func() { //写一个匿名函数
err := recover() //recover()内置函数,可以用于捕获异常
if err != nil { //说明捕捉到错误
fmt.Println("错误信息:", err) //输出错误信息
}
}()
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res=", res)
}
(2) 使用errors返回错误
func readConf(name string) (err error) {
if name == "config.ini" {
//读取...
return nil
} else {
//返回一个自定义错误
return errors.New("读取文件错误")
}
}
上述操作会返回一个错误类型的值,表示错误。
(3)使用panic显示异常并终止程序(不抛出)
func test3() {
err := readConf("config.ini")
if err != nil {
//如果读取文件发送错误,就输出这个错误,并终止程序
panic(err)
}
fmt.Println("test3()继续执行")
}
使用panic处理异常,相当于throw和raise, 只显示异常,不抛出异常
写在最后
本文是我的日常学习笔记,如果哪里有写错,麻烦请指出来,感谢。这里我也推荐大家多写笔记,写笔记是一个很好的习惯,可以帮助我们更好的吸收和理解学习的新知识,新的一年大家一起加油!