[TOC]
函數是一個固定的程序段,或稱其為一個子程序。可重復調用函數內部代碼塊。
Golang中函數特點:
1. go語言中有3種函數:普通函數、匿名函數(沒有名稱的函數)、方法(定義在struct上 的函數)。
2. go語言中不允許函數重載(overload),也就是說不允許函數同名。
3. go語言中的函數不能嵌套函數,但可以嵌套匿名函數。
4. 函數是一個值,可以將函數賦值給變量,使得這個變量也成為函數。
5. 函數可以作為參數傳遞給另一個函數。
6. 函數的返回值可以是一個函數。
7. 函數調用的時候,如果有參數傳遞給函數,則先拷貝參數的副本,再將副本傳遞給函數。
8. 函數參數可以沒有名稱。
## 引入
打印9x9乘法口訣表
```go
package main
import "fmt"
func main() {
// i變量作為y軸
for i := 1; i <= 9; i++ {
// j變量作為x軸
for j := 1; j <= 9; j++ {
// x軸只能小于等于y軸
if j <= i {
fmt.Printf("%dx%d=%-2d ", i, j, i*j)
} else { // 當大于時,調出for循環。
break
}
}
fmt.Println("")
}
}
```
問題一:
f:如果某段程序需要重發打印9x9乘法口訣表。可以不可以復制粘貼以上代碼打印呢?
a:運行肯定沒有問題。
問題二:
f:請看問題一,運行沒有問題。有大量重發代碼,能否優化,如何優化?
a:可以優化。將代碼塊搞成函數即可
## 函數聲明
Go語言中定義函數使用func關鍵字,具體格式如下:
```go
/*
函數注釋
*/
func 函數名(形參1, 形參n) (返回值類型1, 返回值類型n){
函數體
return 返回值
}
```
格式解釋:
- `func` :函數聲明關鍵字,固定不變
- `函數名` :由字母、數字、下劃線組成。但函數名的第一個字母不能是數字。**在同一個包內,函數名稱不能重名**。當沒有名稱時,就是匿名函數【可選】
- `參數` :參數由參數變量和參數變量的類型組成,參數變量可以省略,可以有一個參數,也可以有多個,也可以沒有;多個參數之間使用,分隔;多個參數時參數變量要么全寫,要么全省略;如果多個相鄰參數的類型是一樣的,可以只保留同一類型最后一個參數的聲明。【可選】
- `返回值` :返回值由返回值變量和其變量類型組成,返回值變量可以省略,可以有一個返回值,也可以有多個,也可以沒有;多個返回值必須用()包裹,并用,分隔;多個返回值時返回值變量要么全寫,要么全省略。【可選】
- `函數體` :實現指定功能的邏輯。
- `return語句` :函數的終止語句。當遇到 return 語句,下面的語句塊都不執行。
- `函數注釋` :解釋函數的功能及說明函數如何使用。**必須是func上面一行,中間不能有空行**。 【可選】
定義一個打印9x9乘法口訣表
```go
func multTable() {
for i := 1; i <= 9; i++ {
for j := 1; j <= 9; j++ {
if j <= i {
fmt.Printf("%dx%d=%-2d ", i, j, i*j)
} else {
break
}
}
fmt.Println("")
}
}
```
## 函數調用
定義了函數之后,未調用函數的話。是不會執行函數體里的語句。例如上面的九九乘法口訣表沒有在main函數或者其他函數調用的話,就不會打印出來的。
函數調用語法,具體格式如下:
```go
// 無參無返回值
函數名()
// 有參無返回值
函數名(參數1, 參數n)
// 無參有返回值
返回值1, 返回值n := 函數名()
// 有參有返回值
返回值1, 返回值n := 函數名(參數1, 參數n)
```
在 main 函數調用上面定義的九九乘法口訣表函數
```go
func main() {
fmt.Println("multTable func begin")
// 打印9x9乘法口訣表
multTable()
fmt.Println("multTable func end")
}
```
- Golang簡介
- 開發環境
- Golang安裝
- 編輯器及快捷鍵
- vscode插件
- 第一個程序
- 基礎數據類型
- 變量及匿名變量
- 常量與iota
- 整型與浮點型
- 復數與布爾值
- 字符串
- 運算符
- 算術運算符
- 關系運算符
- 邏輯運算符
- 位運算符
- 賦值運算符
- 流程控制語句
- 獲取用戶輸入
- if分支語句
- for循環語句
- switch語句
- break_continue_goto語法
- 高階數據類型
- pointer指針
- array數組
- slice切片
- slice切片擴展
- map映射
- 函數
- 函數定義和調用
- 函數參數
- 函數返回值
- 作用域
- 函數形參傳遞
- 匿名函數
- 高階函數
- 閉包
- defer語句
- 內置函數
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 編碼
- 字符與字節
- 字符串
- 讀寫文件
- 結構體
- 類型別名和自定義類型
- 結構體聲明
- 結構體實例化
- 模擬構造函數
- 方法接收器
- 匿名字段
- 嵌套與繼承
- 序列化
- 接口
- 接口類型
- 值接收者和指針接收者
- 類型與接口對應關系
- 空接口
- 接口值
- 類型斷言
- 并發編程
- 基本概念
- goroutine
- channel
- select
- 并發安全
- 練習題
- 第三方庫
- Survey
- cobra