Golang——包引入和闭包
生活随笔
收集整理的這篇文章主要介紹了
Golang——包引入和闭包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
包引入:
使用包的原因:
如何引入:
使用package關鍵字引入,包的路徑就可以使用包下的函數了,但是被使用的函數名首字母必須是大寫的。
package mainimport ("basics/src/bao" // 這里是引入文件所在包的路徑"fmt" )func main() {fmt.Println("A")bao.Get() // 這里是文件名.函數名 }utils包
package bao // 這里盡量可以和包名一樣import "fmt"func Get() {fmt.Println("get") }取別名方式導入包:
取別名方式定義好了以后要使用,否則報錯
package mainimport (utils "basics/src/bao" // 這里是引入文件所在包的路徑"fmt" )func main() {fmt.Println("A")utils.Get() // 這里是文件名.函數名 }包引用后不適用會報錯,可以忽略
import (_"fmt" // 引入了包沒有用,會報錯,加上下劃線可以忽略"unsafe" )閉包:
- 閉包(closure)是在其詞法上下文中引用了自由變量的函數,或者說是函數和其引用環境的組合體,總結就是閉包是一個函數和其它引用環境組合的一個實體
- 閉包讓我們不用傳遞參數就可讀取或修改環境狀態,當然也需要為此付出額外代價。對于 性能要求較高的場合,須慎重使用
test返回的匿名函數會引用上下文環境變量x。當該函數在main中執行 時,它依然可以正確讀取x的值,這種現象就稱作閉包
func test(x int) func() {return func() {println(x)} } func main() {f := test(123)f() }輸出:
123通過輸出指針,閉包直接引用了原環境變量。所以說閉包是函數和引用環境組合體更加確切
func test(x int) func() {println(&x)return func() {println(&x, x)} } func main() {f := test(0x100)f() }輸出:
0xc82000a100 0xc82000a100 256正因為閉包通過指針引用環境變量,那么可能會導致其生命周期延長,被分配到堆內存。 另一方面,也有所謂延遲求值的特性
func main() {for f := range test() { //迭代執行所有匿名函數f()} }func test() []func() {var s []func()for i := 0; i < 2; i++ {s = append(s, func() { //將多個匿名函數添加到列表println(&i, i)})}return s //返回匿名函數列表 }輸出:
0xc82000a078 2 0xc82000a078 2結果是一樣的,道理很簡單,for循環復用局部變量i,那么每次添加的匿名函數引用的自然是同一變量。而且添加操作也僅僅是將匿名函數放入列表,并未執行。因此, 當main執行這些函數時,它們讀取的是環境變量i循環結束后的最終值,不是2,還能是什么? 解決方法就是每次用不同的環境變量,讓各自閉包環境俱不相同
func test() []func() {var s []func()for i := 0; i < 2; i++ {x := i // x每次循環都重新定義分配。s = append(s, func() {println(&x, x)})}return s }輸出:
0xc82006e000 0 0xc82006e008 1閉包應用:
func main() {f := file(".png")fmt.Println(f("aaa")) }func file(f string) func(string) string {return func(fileName string) string {if !strings.HasPrefix(fileName, f) {return fileName + f}return fileName} }多個匿名函數引用同一環境變量,也會讓事情變得更加復雜。任何的修改行為都會影響其 他函數取值,在并發模式下可能需要做同步處理
func main() {a, b := test(100)a()b() }func test(x int) (func(), func()) { // 返回兩個匿名函數。return func() {println(x)x += 10 //修改環境變量。}, func() {println(x) //顯示環境變量。} }輸出:
100 110總結
以上是生活随笔為你收集整理的Golang——包引入和闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android theme继承原理,an
- 下一篇: dt程序网站服务器配置,ZKWeb 官网