标签:command class ref ola 部分 func 遇到 传递 recover
@
定义函数使用关键字func,并且左大括号不能另起一行
func main(){
a,b := 1,2
//传入值类型的拷贝,(int,string),不会改变这里的值
B(a,b)
fmt.Println("a,b=",a,b)
fmt.Println(A())
ss := []int{5,6,7,8}
//传入的参数是slice,是数组地址的拷贝,会改变这里的值,类似指针
C(ss)
fmt.Println("ss=",ss)
}
func A()(int, int, int){
a,b,c := 1,2,3
return a,b,c
}
func B(s ...int){
//a是个slice,不定长变参,只能作为最后一个参数
s[0]=3
s[1]=4
fmt.Println("s=",s)
}
func C(s []int){
s[0] = 55
s[1] = 66
s[2] = 77
s[3] = 88
fmt.Println(s)
}
/*
> Output:
command-line-arguments
s= [3 4]
a,b= 1 2
1 2 3
[55 66 77 88]
ss= [55 66 77 88]
*/
值类型传递和引用类型传递都是拷贝,但是值类型是拷贝值,而引用类型是拷贝地址
Go语言中,一切皆类型,函数也能作为一种类型使用
func main(){
a := A
a()
}
func A(){
fmt.Println("Func A")
}
/*
> Output:
command-line-arguments
Func A
*/
-匿名函数不能是最外层函数
func main(){
a := func(){
fmt.Println("Func A")
}
a()
}
func A(){
fmt.Println("Func A")
}
/*
> Output:
command-line-arguments
Func A
*/
func main(){
f := closure(10)
fmt.Println(f(1))
fmt.Println(f(2))
}
func closure(x int) func(int) int {
fmt.Printf("outside %p\n", &x)
return func(y int) int {
fmt.Printf("%p\n", &x)
return x * y
}
}
/*
> Output:
command-line-arguments
outside 0xc042054080
0xc042054080
10
0xc042054080
20
*/
func main(){
fmt.Println("a")
defer fmt.Println("b")
defer fmt.Println("c")
}
//a,c,b
func main(){
for i:=0; i<3; i++ {
defer func() {
fmt.Println(i)
}()
}
fmt.Println("a")
defer fmt.Println("b")
defer fmt.Println("c")
}
/*
> Output:
command-line-arguments
a
c
b
3
3
3
*/
func main(){
A()
B()
C()
}
func A() {
fmt.Println("Func A")
}
//defer要放在panic前面才有效,程序遇到panic就停了,所以要在这之前先注册defer的函数,且panic语句也不会执行了
func B() {
defer func() {
if err:=recover(); err!=nil{
fmt.Println("recover in B")
}
}()
panic("panic in B")
}
func C() {
fmt.Println("Func C")
}
/*
> Output:
command-line-arguments
Func A
recover in B
Func C
*/
func main(){
var fs = [4]func(){}
for i := 0; i<4; i++ {
//值拷贝i+defer先进后出的输出
defer fmt.Println("defer i= ",i)
//引用拷贝(匿名函数没有参数,引用的i是外层的地址拷贝,为4)+defer
defer func() {fmt.Println("defer_closure i= ",i)}()
//引用拷贝(匿名函数没有参数,引用的i是外层的地址拷贝,为4)
fs[i] = func(){ fmt.Println("closure i= ",i)}
}
for _,f := range fs {
f()
}
}
/*
> Output:
command-line-arguments
closure i= 4
closure i= 4
closure i= 4
closure i= 4
defer_closure i= 4
defer i= 3
defer_closure i= 4
defer i= 2
defer_closure i= 4
defer i= 1
defer_closure i= 4
defer i= 0
*/
标签:command class ref ola 部分 func 遇到 传递 recover
原文地址:https://www.cnblogs.com/leafs99/p/golang_basic_06.html