[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