GO语言基础入门-六大知识点 | 青训营笔记

76 阅读4分钟

前言

这是我参与「第五届青训营 」伴学笔记创作活动的第 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, 只显示异常,不抛出异常

写在最后

本文是我的日常学习笔记,如果哪里有写错,麻烦请指出来,感谢。这里我也推荐大家多写笔记,写笔记是一个很好的习惯,可以帮助我们更好的吸收和理解学习的新知识,新的一年大家一起加油!