[13th][Day4] defer fallthrough

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。


<<:  [13th][Day6] Docker log

>>:  Rust-资料型别-整数、浮点数

Day 22 - Django + YOLO 後台整合应用

Day 22 - Django + YOLO 後台整合应用 今天的任务是将 Day 07 - RES...

JS Library 学习笔记:首先当然来试试 jQuery (三)

除了监听事件外,jQuery也提供了定义好的动态效果函式,让开发者直接使用,并透过传入相关参数,去自...

[iT铁人赛Day5]JAVA的优先顺序

上次优先顺序还没讲,今天就来讲解一下 数学的运算符号有优先顺序的差别,JAVA也有 数学符号无疑是加...

敏捷开发 组别

敏捷开发 https://wolkesau.medium.com/敏捷开发-1afc1cd6edf ...

介绍Vertex(2) | ML#Day19

接下来我们从训练新模型开始,就这个部分其实也可从页签资料集进入。 1. 来源选择之後的统计 画面上是...