Golang 函数
函数基础介绍
- 函数声明:
- 基础语法:
func functionname(parametername type) returntype { // 函数体(具体实现的功能) } // 解析: functionname: 函数名 parametername type: 参数名,以及参数类型;(可多选,亦可不选) returntype:返回值的类型;(可多选,亦可不选)
- 小demo:
package main import ( "fmt" ) func hello() { fmt.Println("Hello") } func main() { hello() }
- 参数名:
- 若同时有多个相同类型的参数,只需在最后一个参数后面声明参数类型即可:
- 示例:
func calculateBill(price, no int) int { var totalPrice = price * no return totalPrice }
- 返回值 return
- 没有返回值:
- 若函数没有返回值,则不能进行赋值给变量;
- 单个返回值:
- 直接在形参的扩号后面加上返回值的类型即可:
func hello() int { fmt.Println("Hello") return 0 }
- 多返回值:
- 支持一个函数可以有多个返回值。
- 若返回多个返回值,返回值的类型需要用括号括起来;
- 示例:
func hello(a, b string) (int, int) { c := a + b fmt.Println("Hello, ", c) return 0, 1 }
- 命名返回值:
- 在函数中也可以将返回值直接先命名;这样相当于在函数作用域中的第一行就声明的了变量;
- 不需要在return中明确指定返回值,默认会返回,作用域中的定义后的值;当然了也可以直接定义,不过这样会覆盖掉有了名字的返回值:
- 示例:
func hello(a, b string) (num1 int, num2 int) { num1 = len(a) num2 = len(b) return }
- 空白符:
- _ 在 Go 中被用作空白符,可以用作表示任何类型的任何值。
- 当函数返回多个值,但是只需要用到其中一个时,这时候就可以利用_空白符;
- 示例:
package main import ( "fmt" ) func hello(a, b string) (num1, num2, num3 int) { num1 = len(a) num2 = len(b) num3 = len(b) return } func main() { a, _, _ := hello("wor", "ld") fmt.Println(a) }
- 函数调用:
- 语法: 函数名() ;
- 等同于python中的函数调用;不过,不支持 位置传参;
可变参数
- 在函数中,最后一个参数是:...T :表示该函数可以接受任意个数类型为T的参数作为最后参数;
- 工作原理:
- ... 在go中作为语法糖,等同于python中的 * ;在形参上为 聚合,调用时的实参为打散;
- 将可变参数,组成了一个切片,雷同与python中的*args;
- 因为可变参数,会组成一个切片,所以不支持传入切片到可变参数中;
- 示例:
func fun(nums ...int) { for k, v := range nums { fmt.Println(k, v) } }
匿名函数
- 匿名函数:支持将函数赋值给变量, 也可以将函数作为其他函数的参数或返回值;
- 赋值给变量:
func main() { a := func() { fmt.Println("hello world first class function") } a() fmt.Printf("%T", a) }
- 直接调用:
func main() { func() { fmt.Println("hello world first class function") }() }
- 高阶函数:
- 满足下面两个任意一个条件的函数,被称为高级函数:
- 接受一个或多个函数作为参数;
- 示例:
package main import ( "fmt" ) // 定义的接受函数为参数的函数 func simple(a func(a, b int) int) { fmt.Println(a(60, 7)) } func main() { // 匿名函数 f := func(a, b int) int { return a + b } simple(f) }
- 返回值是一个函数;
- 示例:
package main import ( "fmt" ) func simple() func(a, b int) int { f := func(a, b int) int { return a + b } return f } func main() { s := simple() fmt.Println(s(60, 7)) }
- 闭包:
- python中的装饰器类似:
- 调用函数外部的变量;
package main import ( "fmt" ) func appendStr() func(string) string { t := "Hello" c := func(b string) string { t = t + " " + b return t } return c } func main() { a := appendStr() b := appendStr() fmt.Println(a("World")) fmt.Println(b("Everyone")) fmt.Println(a("Gopher")) fmt.Println(b("!")) }