什么是 Defer
延迟执行 Defer 语句用于在当前的 Defer 语句返回之前执行一个函数调用。文字不好理解,直接上代码,更容易理解一点。
package main import "fmt" func main() { sayHi("Boyce") } func sayHi(name string) { defer sayBye() fmt.Println("Hi", name) fmt.Println("bla bla bla ...") } func sayBye() { fmt.Println("bye bye . . .") }
// go run .deferSayHi.go Hi Boyce bla bla bla ... bye bye . . .
Defer 方法
Defer 不仅能用于上面的 function ,也可以用于下面的 method
package main import "fmt" type msg struct { sender string subject string content string } func (m msg) msgInfo() { fmt.Println("subject:", m.subject) fmt.Println("from:", m.sender) fmt.Println("content is :", m.content) } func main() { m := msg{ sender: "Boyce", subject: "error log", content: "your site is down", } defer m.msgInfo() fmt.Println("ding ding ding, you have a new alert ...") } // go run .deferMethod.go ding ding ding, you have a new alert ... subject: error log from: Boyce content is : your site is down
Defer 参数的计算
延迟函数的参数是在执行 defer 语句时求值,而不是在实际函数调用完成时求值。
用代码再解释一下:
package main import "fmt" func printDefer(input int) { fmt.Println("the value in defer is", input) } func main() { a := 2 defer printDefer(a) a = 10 fmt.Println("the value before defer is", a) }
// go run .deferParamCal.go the value before defer is 10 the value in defer is 2
多 Defer 的执行顺序
package main import "fmt" func main() { sayHi("Boyce") } func sayHi(name string) { for _, v := range []rune(name) { defer fmt.Printf("%c", v) } defer fmt.Println("I think your reversed name is ...") fmt.Println("Hi", name) }
defer fmt.Printf("%c", e) defer fmt.Printf("%c", c) defer fmt.Printf("%c", y) defer fmt.Printf("%c", o) defer fmt.Printf("%c", B) defer fmt.Println("I think your reversed name is ...")
//go run .deferStack.go Hi Boyce I think your reversed name is ... ecyoB
总结
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。
- 赞助本站
- 微信扫一扫
-
- 加入Q群
- QQ扫一扫
-
评论