Golang Function
Golang 函数
- 传递可变变量
func test(a,b int args ...int) int { return 0}a,b := 1,2arg = []int{3,4,5}test(1,2,arg...)
- 传递结构化数据到函数的两种写法
package main
import "fmt"
func test() { person := Person{"TigerwolfC", 25} fmt.Printf("person<%s:%d>\n", person.name, person.age) // person.sayHi() person.ModifyAge(28) sayHi(person)
}
type Person struct { name string age int}
func sayHi(p Person) { fmt.Printf("SayHi -- This is %s, my age is %d\n", p.name, p.age)}func (p Person) ModifyAge(age int) { fmt.Printf("ModifyAge") p.age = age}
- 传递函数到函数
func test2(myFunc func(int) int) { // 传递函数到函数,该函数有一个int参数以及一个int类型返回值 fmt.Println(myFunc(7))}
func returnFunc(x string) func() { return func() { fmt.Println(x) }}
func returnFunc2() func(a, b int) int { f := func(a, b int) int { return a + b } return f}
func main() { x := func(y int) int { return y + 1 } test2(x) returnFunc("AGou-ops")() fmt.Println(retrunFunc2()(33, 44))}
- 函数复制
fun main() { x := sayhello fmt.Println(x("AGou-ops"))}
func sayhello(name string) string { return "hello " + name}
- function in function
// 函数内部不能嵌套命名函数,所以只能定义匿名函数func main() { x := func(name string) string { return "hello " + name }("suofeiya") // 在此处加上括号可以直接向函数传递参数
fmt.Println(x)}// -- 2func main() { func() { fmt.Print("func in func") }() // 这个()不可或缺,表示调用该函数}
- 函数回调
package main
import "fmt"
func main() { // 自由变量x var x int // 闭包函数g g := func(i int) int { return x + i } x = 5 // 调用闭包函数 fmt.Println(g(5)) x = 10 // 调用闭包函数 fmt.Println(g(3))}
- 闭包函数
func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum }}
func main() { result := adder() for i := 0; i < 10; i++ { fmt.Println(result(i)) }}
其他
- defer 函数
// defer函数会在当前函数返回前执行传入的函数,它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源func main() { defer func() { // 匿名defer函数 fmt.Println("exec defer()") }() // defer closeDB() // 调用命名函数 // defer fmt.Println("print from defer()") // 调用语句 fmt.Println("END main()")}// outputEND main()exec defer()
:warning: 如果一个函数中有多个refer
函数,会倒序执行每一个refer
函数.
- panic 函数
// panic 强制抛出错误func main() { panic("error here.") fmt.Println("main() function but not working.") // unreachable code,无法执行的语句代码}// outputpanic: error here.
goroutine 1 [running]:main.main() /home/agou-ops/GolandProjects/studyNote/src/code.personal.cc/main.go:42 +0x65exit status 2
panic
能够改变程序的控制流,调用panic
后会立刻停止执行当前函数的剩余代码,并在当前 Goroutine 中递归执行调用方的defer
;recover
可以中止panic
造成的程序崩溃。它是一个只能在defer
中发挥作用的函数,在其他作用域中调用不会发挥作用;
- recover 函数
func main() { defer func() { if err := recover(); err != nil { fmt.Println(err) } }() fmt.Println("main() started") panic("error here.") fmt.Println("END main()") // unreachable code,无法执行的语句代码}
:warning:recover
函数配合panic
函数使用时,需要在defer
函数中嵌套recover
函数(defer函数最后才执行),因为当程序执行到panic
函数时会异常终止,从而会让recover
函数无法捕获panic
错误.