[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