> 本章主要介绍函数的定义及用法,函数支持(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
~~~
- 基础知识
- 开发环境
- 包名规则
- 包初始化 (init)
- 基础数据类型
- 基础类型转换
- 格式化输出
- go指针
- 流程控制语句
- 函数定义
- 匿名函数
- 数组和切片
- map集合
- 结构体
- Interface接口
- 日期处理
- 数学计算
- 正则表达式
- 协程 (并发处理)
- channel
- waitgroup
- mutex (锁机制)
- websocket
- protobuf
- Redis
- 错误处理
- 打包程序
- NSQ消息队列
- 单元测试
- beego
- 安装入门
- Gin
- 快速入门
- 路由与控制器
- 处理请求参数
- 表单验证
- 处理响应结果
- 渲染HTML模版
- 访问静态文件
- Gin中间件
- Cookie处理
- Session处理
- Gin上传文件
- swagger
- pprof性能测试
- GORM
- 入门教程
- 模型定义
- 数据库连接
- 插入数据
- 查询数据
- 更新数据
- 删除数据
- 事务处理
- 关联查询
- 属于 (BELONG TO)
- 一对一 (Has One)
- 一对多 (Has Many)
- 多对多 (Many to Many)
- 预加载 (Preloading)
- 错误处理
- 第三方常用插件
- viper 读取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷键