寒假第一周学习内容概述
复习部分函数内容
基本语法:
func 函数名( 参数列表 ) (返回值列表 ){
执行语句...
return 返回值
}
- 形参列表:表示函数的输入
- 函数中的语句,表示为实现某一代功能的代码块
- 函数可以有返回值也可以没有
注意:若想调用其他函数中的函数,须将函数的首字母大写,且在其他包中调用时,需要把导包。
调用格式:包名.函数名
函数的注意事项和使用:
- 函数中的变量是局部变量,在该函数外不能使用
- 基本数据类型和数组默认是值传递的,即进行值copy在函数外修改,函数外的是不会修改的。
异常处理
nil代表零值,表示没有错误
使用defer 、panic(抛出异常)recover(捕获异常)
defer+recover:
Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误。
以上两种形式的代码是一样的。
自定义错误:
异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。
错误处理的最佳实践 :
-
在多个返回值的函数中,error 通常作为函数最后一个返回值。
-
如果一个函数返回 error类型变量,则先用if 语句处理 error != nil 的异常情况,正常逻辑放到if 语句块的后面,保持代码平坦。
-
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。
-
在错误逐级向上层传递的过程中,错误信息应该不断地丰富和完善,而不是简单地抛出下层调用的错误。这在错误日志分析时非常有用和友好。
注意:(最加粗样式重要)
- 利用recover处理panic指令,defer 必须放在 panic 之前定义,另外 recover 只有在 defer 调用的函数中才有效。否则当panic时,recover无法捕获到panic,无法防止panic扩散。
- recover 处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点。
- 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用。
包
包的本质:
就是创建不同的文件夹,来存放程序文件。
go的每一个文件都属于一个包。
注意:
-
导包:impot+“包的路径”
-
访问包下的函数或变量,格式:包名.函数名/函数名
-
想调用其他包中的函数需要将文件中的函数首字母换成大写的。
-
文件名和包名最好一样便于引用。
-
可以给包取别名在包名的前面写上别名,在使用的时候可以使用别名进行操作。
-
同一个文件下不能有文件相同的函数名,同一个包下两个不同文件里也不允许有名字相同的函数,也不能有全局变量名。否则无法区分调用包下的哪个函数或变量。
-
main包只能有一个,只有在mian包里的最后才能编译成可执行文件。
8.
包的使用细节和注意事项:
调用其他包中的方法:包名.方法
文件操作:
-
相对路径:
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()