💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
> 本章主要介绍函数的定义及用法,函数支持(0至多)个参数,也支持(0至多)个返回值 [TOC] ## 基本函数定义 > 语法 ~~~ func 函数名(参数列表) (返回值类型列表) { } ~~~ > 例子 ~~~ package main import "fmt" // 定义add函数,接受两个int参数,返回值是int类型 func add(x int, y int) int { return x + y } func main() { fmt.Println(add(42, 13)) } ~~~ ## 返回多个值的函数 > go语言的函数允许返回多个值 ~~~ package main import "fmt" // 定义swap函数,接受x,y两个参数,swap函数的作用是交换两个参数值 // 返回两个string类型的值 func swap(x, y string) (string, string) { // 返回多个值,用逗号分隔 return y, x } func main() { // 调用swap函数,并且接受两个返回值,按顺序传递给a和b变量 a, b := swap("hello", "world") fmt.Println(a, b) } ~~~ ## 返回命名参数值 > 我们可以给函数返回值定义命名参数。 ~~~ package main import "fmt" // 定义split函数 // 定义x,y两个int类型的返回值参数 func split(sum int) (x, y int) { // 给x返回值参数赋值 x = sum - 3 // 给y返回值参数赋值 y = sum - x // 直接return,就可以返回x,y参数值 return } func main() { fmt.Println(split(17)) } ~~~ ## 可变参数 > 如果一个函数的参数,类型一致,但个数不定,可以使用函数的可变参数 > 语法 ~~~ func 函数名(参数名 ...类型) [(返回值列表)] { //函数体 } ~~~ > 示例 ~~~ package main import ( "fmt" ) func main() { test("a", "b", "c") } func test(scores ...string) { for _, value := range scores { fmt.Println(value) } } ~~~ ## 忽略参数返回值 > 函数可以返回多个值,有时候我们只想要其中一个值,可以通过 _ 下划线符号,忽略返回值。 > 接上面的例子 ~~~ // 忽略掉第一个返回值 _, y := split(17) // 忽略第二个返回值 x, _ := split(17) ~~~ ## defer语句 > defer是延迟调用语句,延迟调用指的是被defer修饰的函数调用,在父函数执行接结束的时候才会执行defer修饰的函数。 ### 基本用法 > 输出:333 => 222 => 111 ~~~ package main import "fmt" func main() {// 父函数 f := func() {// 父函数 (闭包) defer fmt.Println("111") fmt.Println("222") } // 通过变量f调用闭包函数 defer f() fmt.Println("333") } ~~~ ### defer调用栈 > 如果在同一个函数中,存在多个defer修饰的延迟调用函数,那么执行顺序是怎么样的? ~~~ package main import "fmt" func main() { fmt.Println("counting") for i := 0; i < 10; i++ { // 延迟打印 i defer fmt.Println(i) } // 会比上面的defer语句先执行 fmt.Println("done") } ~~~ > 执行后输出: ~~~ counting done 9 8 7 6 5 4 3 2 1 0 ~~~