# 1.8 函数声明
这是一个很好的机会去介绍函数支持多值返回。查看下面3个函数:一个没有返回值,一个返回一个值,一个返回2个值。
```go
func log(message string) {
}
func add(a int, b int) int {
}
func power(name string) (int, bool) {
}
```
我们常常这样使用最后一种函数:
```go
value, exists := power("goku")
if exists == false {
// 处理出错情况
}
```
如果你只想获得返回值中的某个值,这种情况下,你可以将另外一个返回值赋给`_`:
```go
_, exists := power("goku")
if exists == false {
// 处理出错情况
}
```
这不仅仅是一种约定。`_`是一个空白标识符,尤其在用在返回值时它没有真正的赋值。你可以一直使用`_`,无论返回值是什么类型。
最后,你可能遇到一些不同的函数声明方式,即如果函数的参数都是相同的类型,那么可以使用以下的简洁方式定义:
```go
func add(a, b int) int {
}
```
你会常常遇见函数返回多个值。你也会经常使用`_`去丢弃一个值。具名返回值和不详细的参数声明并不常见。但是迟早你都会遇到,所以了解他们是很重要的。
## 链接
- 关于本书
- 引言
- 准备工作
- 安装开发环境
- 开始使用Go
- 创建一个Go模块
- 第1章:基础知识
- 1.1 编译
- 1.2 静态类型
- 1.3 类c语法
- 1.4 垃圾回收
- 1.5 运行go代码
- 1.6 导入包
- 1.7 变量和声明
- 1.8 函数声明
- 1.9 继续之前
- 第2章:语法学习
- 2.1 声明和初始化
- 2.2 结构体上的函数
- 2.3 构造函数
- 2.4 new
- 2.5 结构体字段
- 2.6 组合
- 2.7 指针类型和值类型
- 2.8 继续之前
- 第3章:复杂类型
- 3.1 数组
- 3.2 切片
- 3.3 映射
- 3.4 指针类型和值类型
- 3.5 继续之前
- 第4章:面向对象
- 4.1 包
- 4.2 接口
- 4.3 继续之前
- 第5章:综合知识
- 5.1 错误处理
- 5.2 defer
- 5.3 go语言风格
- 5.4 初始化的if
- 5.5 空接口和转换
- 5.6 字符串和字节数组
- 5.7 函数类型
- 5.8 内存分配
- 第6章:高并发
- 6.1 go协程
- 6.2 同步
- 6.3 通道
- 6.4 继续之前
- 第7章:工具库
- 7.1 类型转换
- 7.2 时间操作
- 第8章:程序测试
- 单元测试
- 性能测试
- 第9章:简单实例
- 内存分配
- 第10章:项目实战
- 结论
- 附录