> 本章主要介紹函數的定義及用法,函數支持(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 快捷鍵