go开发笔记

100 阅读1分钟

逃逸分析——escape analysis

medium.com/a-journey-w…

函数闭包

在函数内声明的匿名函数能够访问和修改在外部函数中声明的变量

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里定义的所有方法即可。