Go语言中的函数
函数就是一段代码的封装,把一段抽象的逻辑封装成一个函数,给他起个名,每次需要用到的时候直接调用函数名就可以。
函数的写法
基本语法:
func 函数名 (形式参数 形式参数类型) (返回值 返回值类型) { }
返回值
一个函数的返回值可以有一个,可以有多个,也可以没有返回值。
package main
import "fmt"
func add(a int, b int) (add int) {
add = a + b
return
}
func add2(a int, b int) int {
return a + b
}
func multR(a int, b int) (int, int) {
return a + b, a - b
}
func printNum(a int) {
fmt.Println(a)
}
func main() {
fmt.Println(add(1, 2))
fmt.Println(multR(5, 2))
printNum(23)
}
当给返回值起名的时候,可以直接在函数体内使用该变量,return语句后可以不加内容
参数
一个函数可以拥有多个或者一个或者没有参数,当参数类型相同时,可以简写
func foo(x int, y int, z int) {
// come code here
}
func foo1(x, y, z int, a, b string, p, q bool) {
// some code here
}
可变参数
可变参数只能放在参数的最后一个,在传入实际参数的时候可以传入一个、多个或者零个,该参数会形成一个该数据类型的切片
func foo2(name string, ints ...int) (res string) {
// some code here
}
defer
defer关键字修饰的语句可以延时运行,他们会在函数返回前逆序运行
func deferFunc() {
fmt.Println("Now, I open a resource.")
defer fmt.Println("I will close the resource!")
defer fmt.Println("I will be fine.")
fmt.Println("I'm doing somthing with the resource...")
}

{% p red, 如果一个函数有返回值,那么defer语句会在返回值赋值之后、真正返回之前执行!%}
函数类型
函数也属于一种类型,但是参数和返回值类型不同的函数又属于不同的类型,比如func(int, int) int、func(string, string)、func(float64, int) bool等
函数也可以作为参数或者返回值传递,这种函数称为高阶函数
func f1(x, y int) int {
return x + y
}
func f2(f func(int, int) int, x, y int) (int, int) {
return f(x, y), x - y
}
func f3(x int) func(int) int {
ret := func(p int) int {
return x + p
}
return ret
}
匿名函数
对于那些没有名字的函数称为匿名函数,通常用于一个函数的内部
func(类型)类型{}
如果是只用一次的函数可以在匿名函数的最后加上一对()形成立即执行函数
package main
import "fmt"
func main() {
var calFunc = func(x, y int) (int, int, int, int) {
return x + y, x - y, x * y, x / y
}
sum, _, _, quotient := calFunc(10, 2)
func(x, y int) {
fmt.Println(x + y)
}(sum, quotient)
}
闭包函数
闭包(Closure)对于初学者来说肯定是晦涩难懂的,要理解闭包,我们首先必须得理解Go中变量的作用域和函数可以作为返回值这两个概念。
我们先来看一个函数:
func paraClosure(x int) func() int {
res := func () int {
return x + 200
}
return res
}
这个函数它接收一个int类型的变量,返回一个func() int类型的函数
在声明匿名函数的期间,用到了paraClosure函数中的x变量,这种函数就叫做闭包函数
闭包的实际使用
如果在工作期间,你的同事写了这样的一个函数
func exec(f func()) {
fmt.Println("This is func exec")
f()
}
然后你有这样的一个函数
func variable(x, y int) {
fmt.Println("This is func variable")
fmt.Println(x + y)
}
现在你需要把variable函数作为参数传递给exec函数
这时候你就需要用到闭包函数(closure function)
这个闭包函数(closure function)需要接收一个两个int类型参数的函数,返回一个无参无返回值的函数
func closure(f func(int, int), m, n int) func() {
return func() {
f(m, n)
}
}
GO语言中的内置函数
| 内置函数 | 介绍 |
|---|---|
| close | 主要用来关机channel |
| len | 用来求长度,比如string、array、slice、map、channel |
| new | 用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针 |
| make | 也是用来分配内存的,主要用于分配应用类型比如chan、map、slice。返回的是具体的引用 |
| append | 用来追加元素到数组、slice中 |
| panic、recover | 用来做错误处理 |

浙公网安备 33010602011771号