0
点赞
收藏
分享

微信扫一扫

Goland

向上的萝卜白菜 2022-01-16 阅读 65

寒假第一周学习内容概述

复习部分函数内容

基本语法:

func 函数名( 参数列表 ) (返回值列表 ){
   			执行语句...
   			return  返回值
}
  1. 形参列表:表示函数的输入
  2. 函数中的语句,表示为实现某一代功能的代码块
  3. 函数可以有返回值也可以没有
    注意:若想调用其他函数中的函数,须将函数的首字母大写,且在其他包中调用时,需要把导包。
    调用格式:包名.函数名

函数的注意事项和使用:

  1. 函数中的变量是局部变量,在该函数外不能使用
  2. 基本数据类型和数组默认是值传递的,即进行值copy在函数外修改,函数外的是不会修改的。

异常处理

nil代表零值,表示没有错误
使用defer 、panic(抛出异常)recover(捕获异常)
defer+recover:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xit4KomV-1642299901811)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20220111205637693.png)]在这里插入图片描述

Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fq4d8Z8E-1642299901813)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20220111210535257.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tYtGSsYR-1642299901814)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20220111210548195.png)]

以上两种形式的代码是一样的。

自定义错误:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。

错误处理的最佳实践 :

  1. 在多个返回值的函数中,error 通常作为函数最后一个返回值。

  2. 如果一个函数返回 error类型变量,则先用if 语句处理 error != nil 的异常情况,正常逻辑放到if 语句块的后面,保持代码平坦。

  3. defer 语句应该放到 err 判断的后面,不然有可能产生 panic。示例代码如下:

    // 正确写法
    f, err := os.Open("defer.txt")
    if err != nil {
        return nil, errors.New("Open file failed")
    }
    defer f.Close()
     
    // 错误写法
    f, err := os.Open("defer.txt")
     
    defer f.Close()
     
    if err != nil {//说明有错误,捕获到错误了
        return nil, errors.New("Open file failed")
    }
     
    // 如果f为空,就不能调用f.Close()函数了,会直接导致程序panic。
    
  4. 在错误逐级向上层传递的过程中,错误信息应该不断地丰富和完善,而不是简单地抛出下层调用的错误。这在错误日志分析时非常有用和友好。

注意:(最加粗样式重要)

  1. 利用recover处理panic指令,defer 必须放在 panic 之前定义,另外 recover 只有在 defer 调用的函数中才有效。否则当panic时,recover无法捕获到panic,无法防止panic扩散。
  2. recover 处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点。
  3. 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用。

包的本质:

就是创建不同的文件夹,来存放程序文件。
在这里插入图片描述
go的每一个文件都属于一个包。
在这里插入图片描述

注意:

  1. 导包:impot+“包的路径”

  2. 访问包下的函数或变量,格式:包名.函数名/函数名

  3. 想调用其他包中的函数需要将文件中的函数首字母换成大写的。

  4. 文件名和包名最好一样便于引用。

  5. 可以给包取别名在包名的前面写上别名,在使用的时候可以使用别名进行操作。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-INRgSaYd-1642300200625)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20220111111451192.png)]

  6. 同一个文件下不能有文件相同的函数名,同一个包下两个不同文件里也不允许有名字相同的函数,也不能有全局变量名。否则无法区分调用包下的哪个函数或变量。

  7. main包只能有一个,只有在mian包里的最后才能编译成可执行文件。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vJhRaZlj-1642300200626)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20220111112350285.png)]

8.在这里插入图片描述

包的使用细节和注意事项:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KH5zW5YK-1642300200627)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20220111111123624.png)]

调用其他包中的方法:包名.方法

文件操作:

  • 相对路径:

    ab.txt

    相对于当前路径

  • 绝对路径

    /dsd/sdsd/sdsd/sd/ab.txt

    .当前目录

    …上一目录

  • 创建目录:

    os.Mkdir创建一层

    os.Mkdirall创建多层

  • 创建文件:

    os.Create:Creat采取模式0666(任何人都可读写,不可执行)

  • 打开文件:

    相当于当前的程序和文件建立起连接

    根据 os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。

    package main
    
    import (
        "fmt"
        "os"
    )
    
    func main() {
        // 只读方式打开当前目录下的main.go文件
        file, err := os.Open("./main.go")
        if err != nil {
            fmt.Println("open file failed!, err:", err)
            return
        }
        // 关闭文件
        file.Close()
    }
    

    为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句。

  • 关闭文件:

    断开连接:file.Close()

  • 删除文件或文件夹:

    os.Remove()

    os.Removeall()

举报

相关推荐

0 条评论