# 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章:項目實戰
- 結論
- 附錄