10-Go语言基础-函数(func)

简介

Go语言的函数支持 递归、多返回值、可变参数等功能。
在Go语言中,函数类型和其他类型一样,作为一等公民,可以当成其他函数的参数等操作。
函数类型是引用类型。
函数的形参是局部变量,只在本函数内有效。

使用

  1. 函数声明
    func 函数名(形参列表)(返回值列表){
    函数体
    }
  2. 函数作为普通类型使用
    这里把func1作为参数传给func2来执行。
    其中func1的类型是func(int)int
package main
import (
	"fmt"

)

func func2 (addfunc func(int)int){
	out := addfunc(1)
	fmt.Println(out)
}
func main() {
	var func1  func(int)int
	func1=func(in int)(out int){
		return in+1
	}
	func2(func1)
}

看着有点抽象,我们使用type来把函数类型做个重命名。
这里就相当于和struct一样,struct也是做了类型的重命名,否则要跟struct以及后面的一大堆作为类型。

package main
import (
	"fmt"

)
type myfunc func(int)int

func func2 (addfunc myfunc){
	out := addfunc(1)
	fmt.Println(out)
}
func main() {
	var func1  myfunc
	func1=func(in int)(out int){
		return in+1
	}
	func2(func1)
}
  1. 多返回值不说了
  2. 错误有个建议,最后加一个返回值error类型或者Boolean类型都可以,标记调用的成功与否。
  3. defer
    defer后面跟的函数调用。
    defer是入栈规则,后进先出。最先声明的defer函数最后执行。
    defer的时候for循环小心闭包的问题,你可能会在这里栽跟头。
package main
import (
	"fmt"

)

func main() {
	defer func(){
		fmt.Println("defer1")
	}()
	defer func(){
		fmt.Println("defer2")
	}()
	defer func(){
		fmt.Println("defer3")
	}()
	defer func(){
		fmt.Println("defer4")
	}()
	// panic(1)
}
=》输出
defer4
defer3
defer2
defer1

闭包对for defer的影响

package main
import (
	"fmt"

)

func main() {
	for i:=0;i<3;i++{
		defer func(){
			fmt.Println(i)
		}()
	}
}
=>输出
3
3
3

正确的代码

package main
import (
	"fmt"

)

func main() {
	for i:=0;i<3;i++{
		defer func(num int){
			fmt.Println(num)
		}(i)
	}
}
=>输出
2
1
0
  1. panic revover
    panic会引起函数恐慌(崩溃)。需要传入非nil的参数
package main
import (
	"fmt"

)

func main() {
	defer func(){
		if p:=recover();p!=nil{
			fmt.Println(p)
		}
	}()
	//panic(nil)//参数传入nil recover无法捕获到参数,不能定位恐慌原因。
	panic(1)
}
=>
1

有意思的问题,recover要在defer的一级函数内,否则无法使用。
正常捕获恐慌,防止代码异常退出。

package main
import (
	"fmt"

)
func myrecover(){
	if p:=recover();p!=nil{
		fmt.Println(p)
	}
}
func main() {
	defer myrecover()
	
	panic(1)
}
=>
1

无法捕获,直接恐慌。

package main
import (
	"fmt"

)
func myrecover(){
	if p:=recover();p!=nil{
		fmt.Println(p)
	}
}
func main() {
	defer func(){
		myrecover()
	}()
	
	panic(1)
}
=>
panic: 1

goroutine 1 [running]:
main.main()
        G:/gosrc/mypro1/myrun/main.go:16 +0x66
exit status 2
发布了264 篇原创文章 · 获赞 23 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Edu_enth/article/details/104001058
今日推荐