[TOC]html
兵長:胖sir,咋還在看基礎知識嘞?你之前可不是這樣的哦golang
胖sir:切,我今天看的和以前的可不同數組
兵長:有啥不同的,你能給我說出花來嘛閉包
胖sir:小樣,你本身好好看看函數
兵長:看看就看看this
交換2個數字的值spa
i := 10 j := 20 i , j = j, i
t := 3 + 5i fmt.Println(t) //(3+5i) fmt.Printf("type == %T", t)//type == complex128
var tmp int fmt.Scanf("%d", &tmp) fmt.Println("tmp == ", tmp) //tmp == 1 var tmp2 int fmt.Scan(&tmp2) fmt.Printf("type == %T", tmp2)//type == int
bool類型不能與int類型互相轉化指針
type long int64 var a long a = 2 fmt.Printf("type == %T", a) //type == main.long
case後面不須要寫break; 默認就有該功能code
num := 2 switch num { case 1: fmt.Println("111") case 2: fmt.Println("222") //222 case 3: fmt.Println("333") case 4: fmt.Println("4444") }
fallthrough -- 不跳出switch語句,後面無條件執行htm
num := 2 switch num { case 1: fmt.Println("111") case 2: fmt.Println("222") //222 fallthrough case 3: fmt.Println("333") // 333 case 4: fmt.Println("4444") }
switch 後面能夠不用寫 條件,case 後面能夠寫條件
score := 90 switch { //這裏能夠不用寫 條件 case score > 90: //case 後面能夠寫條件 fmt.Println("extent") case score > 80: fmt.Println("good") case score > 70: fmt.Println("not bad") }
func getname(args ...string) { length := len(args) if length > 0 { for i, data := range args { fmt.Printf("%d -- %s\n", i, data) } } } func test(args ...string) { getname(args[1:]...) //只傳遞不定參數中的其中幾個 } func main() { test("qqq", "yyy", "bbb") //0 -- yyy //1 -- bbb }
能夠設置函數類型
func Add(a, b int) int { return a + b } type Universal func(int, int) int func main() { var uni Universal uni = Add res := uni(1, 2) fmt.Println(res) }
經過回調函數實現多態
func Add(a, b int) int { return a + b } type Universal func(int, int) int func cal(uni Universal, a int, b int) int { return uni(a, b) } func main() { uni := Add res := cal(uni, 1, 2) fmt.Println(res) }
golang中,全部的匿名函數都是閉包
一、匿名函數
二、定義匿名函數的時候直接調用
三、定義匿名函數有參數有返回值
name := "qqq" age := 24 //一、匿名函數 f1 := func() { fmt.Printf("name == %s\n", name) fmt.Printf("age == %d\n", age) } f1() //二、定義匿名函數的時候直接調用 func(hobby string) { fmt.Println(name) fmt.Println(hobby) }("basketball") //三、定義匿名函數有參數有返回值 f3 := func(a, b int) int { return a + b } fmt.Println(f3(1, 3)) res := func(a, b int) int { return a + b }(3, 8) fmt.Println(res)
閉包的特色
一、閉包的特色1,能夠捕獲變量,且是以引用的方式捕獲的
二、必要的特色2 ,閉包裏面使用的變量,只要閉包還在使用,則一直有效,哪怕超出該變量的做用域
func cal() func() int { var x int return func() int { x++ return x * x } } func main() { //一、閉包的特色1,能夠捕獲變量,且是以引用的方式捕獲的 a := 1 name := "go" func() { a = 2 name = "hello wrold" fmt.Printf("內部 : a == %d, name == %s\n", a, name) }() fmt.Printf("外部 : a == %d, name == %s\n", a, name) //二、必要的特色2 ,閉包裏面使用的變量,只要閉包還在使用,則一直有效,哪怕超出該變量的做用域 f := cal() fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) }
defer的使用
使用方式相似於棧,先進後出
//延遲調用,main函數結束前進行調用 fmt.Println("hello") defer fmt.Println("over!!") fmt.Println("world") //hello //world //over!! //多個defer的執行順序,相似於棧的方式,先進後出,哪怕中間出現程序錯誤,defer修飾的語句仍然會執行 for i := 0; i < 10; i++ { defer fmt.Println(i) } -------------------------------------------- defer fmt.Println("aaaa") defer fmt.Println("bbb") defer fmt.Println("ccc") // ccc // bbb // aaaa
defer 和匿名函數的使用
// a := 10 // b := 20 // defer func() { // fmt.Printf("inner a == %d, b == %d\n", a, b) // }() // a = 1 // b = 2 // fmt.Printf("externer a == %d, b == %d\n", a, b) // externer a == 1, b == 2 // inner a == 1, b == 2 a := 10 b := 20 defer func(a, b int) { fmt.Printf("inner a == %d, b == %d\n", a, b) }(a, b) //此處參數 a=10 b=20的參與已經傳入到函數中了,只是匿名函數最後執行而已 a = 1 b = 2 fmt.Printf("externer a == %d, b == %d\n", a, b) // externer a == 1, b == 2 // inner a == 10, b == 20
每個包 默認都會有一個init函數,也能夠本身寫一個init函數
每調用一個包,程序會先執行這個包的init函數
main.go
package main import ( "fmt" "hhh/test" ) var a int = 10 func init() { fmt.Println("this is main init") } func main() { a := "xiaozhu" fmt.Println(a) { a := 1.4 fmt.Println(a) } test.Pr() }
test.go
package test import "fmt" func init() { fmt.Println("test init") } func Pr() { fmt.Println("hello wrold") }
http://www.zzvips.com/article...
以上爲本期所有內容,若有疑問能夠在評論區或後臺提出你的疑問,咱們一塊兒交流,一塊兒成長。
好傢伙要是文章對你還有點做用的話,請幫忙點個關注,分享到你的朋友圈,分享技術,分享快樂
技術是開放的,咱們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
做者:小魔童哪吒