函数
golang作用域,定义在函数外的变量是全局的,函数内部定义的变量是局部的。如果一个局部变量和一个全局变量有相同的名字,在函数执行的时候,局部变量将覆盖全局变量。
package main
var a=6
func main(){
p()
q()
p()
}
func p(){
println(a)
}
func q(){
//a := 5//定义变量
a = 5//变量赋值
println(a)
}
当在函数内定义是,输出656,而赋值为655.
局部变量仅在定义它的函数时有效。
package main
var a int
func main(){
a=5
println(a)
f()
}
func f(){
a := 6
println(a)
g()
}
func g(){
println(a)
}
输出565
多值返回。
教程上有趣的例子:
package main
func nextInt(b []byte, i int) (int, int){
x :=0
for ; i
定义一个函数,传递一个byte数组和一个位置i,返回两个int类型。
看到golang的格言: 用更少的代码做更多的事
延迟代码defer。
在defer后指定的函数会在函数退出前调用。
func ReadWrite() bool{
file.Open("file")
//do something
if failureX{
file.Close()
return false
}
if failureY{
file.Close()
return false
}
file.Close()
return true
}
可以用defer修改为:
func ReadWrite() bool{
file.Open("file")
defer file.Close()
//do something
if failureX{
return false
}
if failureY{
return false
}
return true
}
函数在退出前会执行file.Close()
延迟的函数是按照后进先出的顺序执行。
for i:=0;i<5;i++{
defer fmt.Print("%d",i)
}
defer可以修改返回值。
package main
func f() (ret int){
println(ret)
defer func(){
ret++
}()
return 0
}
func main(){
println(f())
}
将输出1,ret是一个int型的命名返回值,这个不要看错了。
变参
例子代码:
package main
func myfunc(arg ...int){
for _,n := range arg{
println(n)
}
}
func main(){
myfunc(1,2,3,4,5)
}
将打印所有参数。arg ...int说明这个函数接受不定数量的参数。参数类型全部是int。在函数体中,变量arg是一个int类型的slice。
函数作为值
package main
import "fmt"
func main(){
a := func(){
println("hello")
}
a()//
fmt.Printf("%T",a)
}
先定义一个匿名函数,赋值给a,然后调用函数a(),下面语句是输出a的类型。
接受函数作为参数的函数
回调
Panic和Recover
golang没有像Java那样的异常机制:不能抛出异常。作为替代,使用panic和recover机制。这要作为最后手段使用。
没看懂。。。
上一篇: golang笔记-array、slices和map
下一篇: golang学习-包、指针和内存分配
0 Responses so far.