package main
import "fmt"
type temp struct{}
func (t *temp) Add(elem int) *temp {
fmt.Println(elem)
return &temp{}
}
func main() {
tt := &temp{}
defer tt.Add(1).Add(2)
tt.Add(3)
}
这道题的输出顺序是1 3 2,这道题来自于golang中文网的每日一题
一开始没看出来,其实还是有迹可循的。
我把这道题的关键部分用括号括起来就知道是什么个逻辑了
package main
import "fmt"
type temp struct{}
func (t *temp) Add(elem int) *temp {
fmt.Println(elem)
return &temp{}
}
func main() {
tt := &temp{}
defer (tt.Add(1)).Add(2)
tt.Add(3)
}
defer是函数结尾的时候进行的一个结尾函数,一般有两种写法,分别对应结尾是要执行一个函数还是多个函数
执行单个函数
defer Func1
执行多个函数
defer func(){
Func1()
Func2()
}()
那么上面的题目,准确的来说只是执行了最后一个Add,也就是Add(2),而这个tt.Add(1)的作用只不过是提供了一个值,并不是要执行的函数,所以按照执行的循序是1 3 2,当然我们也可以调个顺序,写成如下
package main
import "fmt"
type temp struct{}
func (t *temp) Add(elem int) *temp {
fmt.Println(elem)
return &temp{}
}
func main() {
tt := &temp{}
tt.Add(3)
defer (tt.Add(1)).Add(2)
}
这样的话 按照顺序执行就是3 1 2.
完结