defer 延迟执行
Golang 有个很方便的东东:defer,他执行的时间点会是在离开目前的 function 时
不过这里需要注意的是有两个地方:
变数的传递,会在呼叫defer的时候传入.所以他并非单纯的直接移到最後呼叫
根据 GoDoc Defer:
> The arguments to the deferred function (which include the receiver if the function is a
> method) are evaluated when the defer executes.
那麽 defer 要用在何处呢?记得 defer 的特性是在函式 return 前执行,而且『一定会』被执行
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("/src/ironman/D4/test.md")
if err != nil {
fmt.Println(err)
} else {
b1 := make([]byte, 5)
n1, err := f.Read(b1)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("%d bytes: %s\n", n1, string(b1))
// 处理读取的内容....
f.Close()
}
}
}
这是一个读取档案的例子
os.Open()
f.Read()
上面的两个 func 都汇回传两个值,第二个值 err 代表的是 func 执行中是否发生错误,因此程序中进行了错误的检查,在没有错误的情况下才进行档案的读取与内容处理,而最後透过
f.Close()
关闭档案。
defer 是用来宣告 function 结束前的动作。
然而,有时候我们会想传入值给 deferred function,此时分成两种状况:
使用 defer 宣告时的变数值
使用 deferred function 执行时的变数值
在写程序,我们常犯一种低级错误,就是要了资源,but ... 没有释放。
以读取档案来举例:你 fopen 了档案,却没有 fclose
如何降低错误率?尽量减少 fopen 和 fclose 之间的距离,越近越好。最好是 fopen 完就呼叫 fclose ,这样犯错的可能性就降低很多了。
defer 是非常非常好用 而且很多情境下必须使用的东西
fallthrough
go 中的 fallthrough 使用方法
golang 的 switch 『默认』每个 case 最後都自带 break,执行完成後会跳出整个 switch 不会向下执行
(如果有写过其他的程序语言,尝试不要在 switch 中,不写 break 看看,看这个 switch 到底有没有什麽用)
使用 fallthrough 可以强致执行後面的case
它只能用作 case 子句的最後面。
func main() {
switch "Bond" {
case "Moneypenny":
fmt.Println("this should not print")
fallthrough
case "BBBB":
fmt.Println("this should not print2")
fallthrough
case "Bond":
fmt.Println("this should not print3")
fallthrough
case "CC":
fmt.Println("this should not print4")
fallthrough
default:
fmt.Println("this is default")
}
}
不能在最後一个 case 加上 fallthrough,会喷出错误
//scannot fallthrough final case in switch
golang 的 fallthrough 会『强制』执行後面的 case ,fallthrough 『不会判断』下一则 case 的 true / false。
Day 22 - Django + YOLO 後台整合应用 今天的任务是将 Day 07 - RES...
除了监听事件外,jQuery也提供了定义好的动态效果函式,让开发者直接使用,并透过传入相关参数,去自...
上次优先顺序还没讲,今天就来讲解一下 数学的运算符号有优先顺序的差别,JAVA也有 数学符号无疑是加...
敏捷开发 https://wolkesau.medium.com/敏捷开发-1afc1cd6edf ...
接下来我们从训练新模型开始,就这个部分其实也可从页签资料集进入。 1. 来源选择之後的统计 画面上是...