[TOC]
## 函數定義
函數使用`func`關鍵字,具體格式如下:
~~~
func 函數名(參數)(返回值){
函數體
}
~~~
* 函數名:由字母、數字、下劃線組成。但函數名的第一個字母不能是數字。在同一個包內,函數名也稱不能重名。
* 參數:參數由參數變量和參數變量的類型組成,多個參數之間使用`,`分隔。
* 返回值:返回值由返回值變量和其變量類型組成,也可以只寫返回值的類型,多個返回值必須用`()`包裹,并用`,`分隔。
* 函數體:實現指定功能的代碼塊。
eg:
~~~
func intSum(x int, y int) int {
return x + y
}
~~~
函數的參數和返回值都是可選的,不是必須的。
## 函數的調用
定義了函數之后,我們可以通過`函數名()`的方式調用函數。
~~~
func main() {
sayHello()
}
~~~
注意,調用有返回值的函數時,可以不接收其返回值。
## 參數
### 類型簡寫
函數的參數中如果相鄰變量的類型相同,則可以省略類型
eg:
~~~
func intSum(x, y int) int {
return x + y
}
~~~
### 可變參數
可變參數是指函數的`參數數量`不固定。Go語言中的可變參數通過在參數名后加`...`來標識。
注意:可變參數通常要作為函數的最后一個參數。
eg:
~~~
func intSum2(x ...int) int {
fmt.Println(x) //x是一個切片
sum := 0
for _, v := range x {
sum = sum + v
}
return sum
}
func main(){
ret1 := intSum2()
ret2 := intSum2(10)
ret3 := intSum2(10, 20)
ret4 := intSum2(10, 20, 30)
fmt.Println(ret1, ret2, ret3, ret4) //0 10 30 60
}
~~~
本質上,函數的可變參數是通過切片來實現的。
## 返回值
### 多返回值
Go語言中函數支持多返回值,函數如果有多個返回值時必須用`()`將所有返回值包裹起來。
eg:
~~~
func calc(x, y int) (int, int) {
sum := x + y
sub := x - y
return sum, sub
}
~~~
### 返回值命名
函數定義時可以給返回值命名,并在函數體中直接使用這些變量,最后通過`return`關鍵字返回。
eg:
~~~
func calc(x, y int) (sum, sub int) {
sum = x + y
sub = x - y
return
}
~~~
### 返回值補充
當我們的一個函數返回值類型為slice時,nil可以看做是一個有效的slice,沒必要顯示返回一個長度為0的切片。
~~~go
func someFunc(x string) []int {
if x == "" {
return nil // 沒必要返回[]int{}
}
...
}
~~~
- Go準備工作
- 依賴管理
- Go基礎
- 1、變量和常量
- 2、基本數據類型
- 3、運算符
- 4、流程控制
- 5、數組
- 數組聲明和初始化
- 遍歷
- 數組是值類型
- 6、切片
- 定義
- slice其他內容
- 7、map
- 8、函數
- 函數基礎
- 函數進階
- 9、指針
- 10、結構體
- 類型別名和自定義類型
- 結構體
- 11、接口
- 12、反射
- 13、并發
- 14、網絡編程
- 15、單元測試
- Go常用庫/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go優化
- Go問題排查
- Go框架
- 基礎知識點的思考
- 面試題
- 八股文
- 操作系統
- 整理一份資料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小點
- 樹
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面試題
- 基礎
- Map
- Chan
- GC
- GMP
- 并發
- 內存
- 算法
- docker