if failureX {
return false
}
if failureY {
return false
}
return true
}
如果有很多调用defer,那么defer是采用后进先出模式,所以如下代码会输出4 3 2 1 0
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}
defer 给我的第一印象就是,类似java中的
try {
}finally {
}
我目前的理解就是,在函数块中使用defer,就是函数对应的有一个栈空间,先进后出。需要函数结束后调用栈,来出发defer操作。
如果,一个对象的创建,很消耗内存,需要及时关闭,defer无法像try finnaly哪样准确。
package main
import "fmt"
import "time"
type User struct {
username string
}
func (this *User) Close() {
fmt.Println(this.username, "Closed !!!")
}
func main() {
u1 := &User{"jack"}
defer u1.Close()
u2 := &User{"lily"}
defer u2.Close()
time.Sleep(10 * time.Second)
fmt.Println("Done !")
}
[vicky@localhost goroutine]$
[vicky@localhost goroutine]$ go run deferTest1.go
Done !
lily Closed !!!
jack Closed !!!
[vicky@localhost goroutine]$
实际上,线程Sleep的10秒,u1,和u2早就可以Close()了,但却需要依赖main()函数的结束,才能defer执行。
那么尝试给defer添加内部代码区:
package main
import "fmt"
import "time"
type User struct {
username string
}
func (this *User) Close() {
fmt.Println(this.username, "Closed !!!")
}
func main() {
{
// 即便加了代码快范围,依旧也要主函数体结束才执行defer
u1 := &User{"jack"}
defer u1.Close()
}
u2 := &User{"lily"}
defer u2.Close()
time.Sleep(10 * time.Second)
fmt.Println("Done !")
}
Done !
lily Closed !!!
jack Closed !!!
[vicky@localhost goroutine]$
依旧defer的执行在Done!后。那么如何才能达到try finally 哪样准确的Close呢?
package main
import "fmt"
import "time"
type User struct {
username string
}
func (this *User) Close() {
fmt.Println(this.username, "Closed !!!")
}
func main() {
u1 := &User{"jack"}
f(u1) // 这样的方式,u1才会不依赖main函数的执行
// 这样的方式,u2也不会依赖main函数的执行
u2 := &User{"lily"}
// m := func() {
// defer u2.Close()
// // u2 do somthing
// }
// m()
func() {
defer u2.Close()
// u2 do somthing
}()
time.Sleep(10 * time.Second) fmt.Println("Done !")}func f(u *User) { defer u.Close() // u1 do gomething}