逃逸分析——escape analysis
函数闭包
在函数内声明的匿名函数能够访问和修改在外部函数中声明的变量
func StartTimer (name string) func(){
t := time.Now()
log.Println(name, "started")
return func() {
d := time.Now().Sub(t)
log.Println(name, "took", d)
}
}
func RunTimer() {
stop := StartTimer("My timer")
defer stop()
time.Sleep(1 * time.Second)
}
go里面的接口有什么意义?
type Logic interface {
Process (data string) string
}
type LogicProvider struct {}
// 这是 LogicProvider 上名为“Process”的方法 struct
func (lp LogicProvider) Process (data string) string {
// 业务逻辑
}
// 这是具有 Logic 接口作为属性的客户端结构
type Client struct {
L Logic
}
func(c Client) Program() {
// 从某处获取数据
cLProcess(data)
}
func main() {
c := Client {
L: LogicProvider{},
}
c.Program()
}
上面的代码里有一个Logic接口,LogicProvider结构体隐式实现了这个接口,而在Client结构体里面又内嵌咯LogicProvider结构体,这也就表明Client可以通过LogicProvider任意使用Logic接口里的所有方法,或者有一天Client不想用LogicProvider了,想用其他功能更优越的结构体,但同时又想继续使用Logic接口的方法,这时候只需要新的那个结构体也实现Logic里定义的所有方法即可。