[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...
以上为本期所有内容,若有疑问能够在评论区或后台提出你的疑问,咱们一块儿交流,一块儿成长。
好家伙要是文章对你还有点做用的话,请帮忙点个关注,分享到你的朋友圈,分享技术,分享快乐
技术是开放的,咱们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
做者:小魔童哪吒