如何免费网站建设,哪个网站可以做行测题目,网站建设 任务分配表,天津做网站找津坤科技1.变量作用域
全局变量
全局变量是定义在函数外部的变量#xff0c;它在程序整个运行周期内都有效。 在函数中可以访问到全局变量。
package mainimport fmt//定义全局变量num
var num int64 10func testGlobalVar() {fmt.Printf(num%d\n, num) /…1.变量作用域
全局变量
全局变量是定义在函数外部的变量它在程序整个运行周期内都有效。 在函数中可以访问到全局变量。
package mainimport fmt//定义全局变量num
var num int64 10func testGlobalVar() {fmt.Printf(num%d\n, num) //函数中可以访问全局变量num
}
func main() {testGlobalVar() //num10
}局部变量
局部变量又分为两种 函数内定义的变量无法在该函数外使用例如下面的示例代码main函数中无法使用testLocalVar函数中定义的变量x
func testLocalVar() {//定义一个函数局部变量x,仅在该函数内生效var x int64 100fmt.Printf(x%d\n, x)
}func main() {testLocalVar()fmt.Println(x) // 此时无法使用变量x
}如果局部变量和全局变量重名优先访问局部变量。
package mainimport fmt//定义全局变量num
var num int64 10func testNum() {num : 100fmt.Printf(num%d\n, num) // 函数中优先使用局部变量
}
func main() {testNum() // num100
}接下来我们来看一下语句块定义的变量通常我们会在if条件判断、for循环、switch语句上使用这种定义变量的方式。
func testLocalVar2(x, y int) {fmt.Println(x, y) //函数的参数也是只在本函数中生效if x 0 {z : 100 //变量z只在if语句块生效fmt.Println(z)}//fmt.Println(z)//此处无法使用变量z
}还有我们之前讲过的for循环语句中定义的变量也是只在for语句块中生效
func testLocalVar3() {for i : 0; i 10; i {fmt.Println(i) //变量i只在当前for语句块中生效}//fmt.Println(i) //此处无法使用变量i
}2.函数类型与变量
定义函数类型
我们可以使用type关键字来定义一个函数类型具体格式如下
type calculation func(int, int) int上面语句定义了一个calculation类型它是一种函数类型这种函数接收两个int类型的参数并且返回一个int类型的返回值。
简单来说凡是满足这个条件的函数都是calculation类型的函数例如下面的add和sub是calculation类型。
func add(x, y int) int {return x y
}func sub(x, y int) int {return x - y
}add和sub都能赋值给calculation类型的变量。
var c calculation
c add函数类型变量
我们可以声明函数类型的变量并且为该变量赋值
func main() {var c calculation // 声明一个calculation类型的变量cc add // 把add赋值给cfmt.Printf(type of c:%T\n, c) // type of c:main.calculationfmt.Println(c(1, 2)) // 像调用add一样调用cf : add // 将函数add赋值给变量ffmt.Printf(type of f:%T\n, f) // type of f:func(int, int) intfmt.Println(f(10, 20)) // 像调用add一样调用f
}3.高阶函数
高阶函数分为函数作为参数和函数作为返回值两部分。
函数作为参数
函数可以作为参数
func add(x, y int) int {return x y
}
func calc(x, y int, op func(int, int) int) int {return op(x, y)
}
func main() {ret2 : calc(10, 20, add)fmt.Println(ret2) //30
}函数作为返回值
函数也可以作为返回值
func do(s string) (func(int, int) int, error) {switch s {case :return add, nilcase -:return sub, nildefault:err : errors.New(无法识别的操作符)return nil, err}
}4.匿名函数和闭包
匿名函数
函数当然还可以作为返回值但是在Go语言中函数内部不能再像之前那样定义函数了只能定义匿名函数。匿名函数就是没有函数名的函数匿名函数的定义格式如下
func(参数)(返回值){函数体
}匿名函数因为没有函数名所以没办法像普通函数那样调用所以匿名函数需要保存到某个变量或者作为立即执行函数:
func main() {// 将匿名函数保存到变量add : func(x, y int) {fmt.Println(x y)}add(10, 20) // 通过变量调用匿名函数//自执行函数匿名函数定义完加()直接执行func(x, y int) {fmt.Println(x y)}(10, 20)
}匿名函数多用于实现回调函数和闭包。
闭包
闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说闭包函数引用环境。 首先我们来看一个例子
func adder() func(int) int {var x intreturn func(y int) int {x yreturn x}
}
func main() {var f adder()fmt.Println(f(10)) //10fmt.Println(f(20)) //30fmt.Println(f(30)) //60f1 : adder()fmt.Println(f1(40)) //40fmt.Println(f1(50)) //90
}变量f是一个函数并且它引用了其外部作用域中的x变量此时f就是一个闭包。 在f的生命周期内变量x也一直有效。 闭包进阶示例1
func adder2(x int) func(int) int {return func(y int) int {x yreturn x}
}
func main() {var f adder2(10)fmt.Println(f(10)) //20fmt.Println(f(20)) //40fmt.Println(f(30)) //70f1 : adder2(20)fmt.Println(f1(40)) //60fmt.Println(f1(50)) //110
}闭包进阶示例2
func makeSuffixFunc(suffix string) func(string) string {return func(name string) string {if !strings.HasSuffix(name, suffix) {return name suffix}return name}
}func main() {jpgFunc : makeSuffixFunc(.jpg)txtFunc : makeSuffixFunc(.txt)fmt.Println(jpgFunc(test)) //test.jpgfmt.Println(txtFunc(test)) //test.txt
}闭包进阶示例3
func calc(base int) (func(int) int, func(int) int) {add : func(i int) int {base ireturn base}sub : func(i int) int {base - ireturn base}return add, sub
}func main() {f1, f2 : calc(10)fmt.Println(f1(1), f2(2)) //11 9fmt.Println(f1(3), f2(4)) //12 8fmt.Println(f1(5), f2(6)) //13 7
}闭包其实并不复杂只要牢记闭包函数引用环境。
5.defer语句
Go语言中的defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时将延迟处理的语句按defer定义的逆序进行执行也就是说先被defer的语句最后被执行最后被defer的语句最先被执行。
举个例子
func main() {fmt.Println(start)defer fmt.Println(1)defer fmt.Println(2)defer fmt.Println(3)fmt.Println(end)
}输出结果
start
end
3
2
1由于defer语句延迟调用的特性所以defer语句能非常方便的处理资源释放问题。比如资源清理、文件关闭、解锁及记录时间等。
defer执行时机
在Go语言的函数中return语句在底层并不是原子操作它分为给返回值赋值和RET指令两步。而defer语句执行的时机就在返回值赋值操作后RET指令执行前。具体如下图所示 defer经典案例
阅读下面的代码写出最后的打印结果。
func f1() int {x : 5defer func() {x}()return x
}func f2() (x int) {defer func() {x}()return 5
}func f3() (y int) {x : 5defer func() {x}()return x
}
func f4() (x int) {defer func(x int) {x}(x)return 5
}
func main() {fmt.Println(f1())fmt.Println(f2())fmt.Println(f3())fmt.Println(f4())
}参考文章
https://www.fansimao.com/1006299.html
https://www.fansimao.com/1006315.html 文章转载自: http://www.morning.tbbxn.cn.gov.cn.tbbxn.cn http://www.morning.qbkw.cn.gov.cn.qbkw.cn http://www.morning.dmhs.cn.gov.cn.dmhs.cn http://www.morning.sqqdy.cn.gov.cn.sqqdy.cn http://www.morning.wrkhf.cn.gov.cn.wrkhf.cn http://www.morning.cwgfq.cn.gov.cn.cwgfq.cn http://www.morning.xzqzd.cn.gov.cn.xzqzd.cn http://www.morning.npmx.cn.gov.cn.npmx.cn http://www.morning.brfxt.cn.gov.cn.brfxt.cn http://www.morning.okiner.com.gov.cn.okiner.com http://www.morning.jrsgs.cn.gov.cn.jrsgs.cn http://www.morning.dwmtk.cn.gov.cn.dwmtk.cn http://www.morning.glkhx.cn.gov.cn.glkhx.cn http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn http://www.morning.jqkrt.cn.gov.cn.jqkrt.cn http://www.morning.dmlgq.cn.gov.cn.dmlgq.cn http://www.morning.wzwyz.cn.gov.cn.wzwyz.cn http://www.morning.rknhd.cn.gov.cn.rknhd.cn http://www.morning.nbqwt.cn.gov.cn.nbqwt.cn http://www.morning.dlmqn.cn.gov.cn.dlmqn.cn http://www.morning.rttkl.cn.gov.cn.rttkl.cn http://www.morning.bpmtz.cn.gov.cn.bpmtz.cn http://www.morning.thmlt.cn.gov.cn.thmlt.cn http://www.morning.hxftm.cn.gov.cn.hxftm.cn http://www.morning.qgghj.cn.gov.cn.qgghj.cn http://www.morning.mtsgx.cn.gov.cn.mtsgx.cn http://www.morning.rwlns.cn.gov.cn.rwlns.cn http://www.morning.dmwbs.cn.gov.cn.dmwbs.cn http://www.morning.nzdks.cn.gov.cn.nzdks.cn http://www.morning.fplwz.cn.gov.cn.fplwz.cn http://www.morning.gyfwy.cn.gov.cn.gyfwy.cn http://www.morning.jcfg.cn.gov.cn.jcfg.cn http://www.morning.yngtl.cn.gov.cn.yngtl.cn http://www.morning.fbtgp.cn.gov.cn.fbtgp.cn http://www.morning.lptjt.cn.gov.cn.lptjt.cn http://www.morning.nspzy.cn.gov.cn.nspzy.cn http://www.morning.sfswj.cn.gov.cn.sfswj.cn http://www.morning.rhkmn.cn.gov.cn.rhkmn.cn http://www.morning.sqmbb.cn.gov.cn.sqmbb.cn http://www.morning.qjlnh.cn.gov.cn.qjlnh.cn http://www.morning.sqdjn.cn.gov.cn.sqdjn.cn http://www.morning.ktskc.cn.gov.cn.ktskc.cn http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn http://www.morning.xfyjn.cn.gov.cn.xfyjn.cn http://www.morning.clgbb.cn.gov.cn.clgbb.cn http://www.morning.rccbt.cn.gov.cn.rccbt.cn http://www.morning.bmmhs.cn.gov.cn.bmmhs.cn http://www.morning.jhwqp.cn.gov.cn.jhwqp.cn http://www.morning.plfy.cn.gov.cn.plfy.cn http://www.morning.btwlp.cn.gov.cn.btwlp.cn http://www.morning.ykgp.cn.gov.cn.ykgp.cn http://www.morning.xtqr.cn.gov.cn.xtqr.cn http://www.morning.gbsby.cn.gov.cn.gbsby.cn http://www.morning.ydrn.cn.gov.cn.ydrn.cn http://www.morning.yfpnl.cn.gov.cn.yfpnl.cn http://www.morning.tfpmf.cn.gov.cn.tfpmf.cn http://www.morning.wqmyh.cn.gov.cn.wqmyh.cn http://www.morning.srgnd.cn.gov.cn.srgnd.cn http://www.morning.zylrk.cn.gov.cn.zylrk.cn http://www.morning.jsxrm.cn.gov.cn.jsxrm.cn http://www.morning.hpnhl.cn.gov.cn.hpnhl.cn http://www.morning.ytmx.cn.gov.cn.ytmx.cn http://www.morning.hxmqb.cn.gov.cn.hxmqb.cn http://www.morning.lskrg.cn.gov.cn.lskrg.cn http://www.morning.xnltz.cn.gov.cn.xnltz.cn http://www.morning.bntgy.cn.gov.cn.bntgy.cn http://www.morning.pinngee.com.gov.cn.pinngee.com http://www.morning.lgsqy.cn.gov.cn.lgsqy.cn http://www.morning.chtnr.cn.gov.cn.chtnr.cn http://www.morning.mkzdp.cn.gov.cn.mkzdp.cn http://www.morning.xkjrs.cn.gov.cn.xkjrs.cn http://www.morning.dzqr.cn.gov.cn.dzqr.cn http://www.morning.zqzhd.cn.gov.cn.zqzhd.cn http://www.morning.rwhlf.cn.gov.cn.rwhlf.cn http://www.morning.jrrqs.cn.gov.cn.jrrqs.cn http://www.morning.fbdtd.cn.gov.cn.fbdtd.cn http://www.morning.xtyyg.cn.gov.cn.xtyyg.cn http://www.morning.nhzzn.cn.gov.cn.nhzzn.cn http://www.morning.lsyk.cn.gov.cn.lsyk.cn http://www.morning.2d1bl5.cn.gov.cn.2d1bl5.cn