回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,8 +1,8 @@
## 5.3. 多返
## 5.3. 多返
在Go中個函數可以返迴多個值。我們已經在之前例子中看到許多標準庫中的函數返迴2個值,一是期望得到的返值,另一是函數出錯時的錯誤信息。下面的例子展示如何編寫多返值的函
在Go中个函数可以返回多个值。我们已经在之前例子中看到许多标准库中的函数返回2个值,一是期望得到的返值,另一是函数出错时的错误信息。下面的例子展示如何编写多返值的函
下面的程序是findlinks的改版本。脩改後的findlinks可以自己起HTTP求,這樣我們就不必再行fetch。因HTTP求和解析操作可能會失敗因此findlinks明了2個返迴值:接列表和錯誤信息。一般而言HTML的解析器可以理HTML面的錯誤結點,構造出HTML頁面結構所以解析HTML很少失敗。這意味着如果findlinks函數失敗了,很可能是由I/O的錯誤導致的。
下面的程序是findlinks的改版本。修改后的findlinks可以自己起HTTP求,这样我们就不必再行fetch。因HTTP求和解析操作可能会失败因此findlinks明了2个返回值:接列表和错误信息。一般而言HTML的解析器可以理HTML面的错误结点,构造出HTML页面结构所以解析HTML很少失败。这意味着如果findlinks函数失败了,很可能是由I/O的错误导致的。
<u><i>gopl.io/ch5/findlinks2</i></u>
```Go
@@ -39,23 +39,23 @@ func findLinks(url string) ([]string, error) {
}
```
在findlinks中有4return句,每一return都返了一值。前三returnhttp和html包中的錯誤信息傳遞給findlinks的調用者。第一return直接返迴錯誤信息,其他兩處通過fmt.Errorf§7.8輸出詳細的錯誤信息。如果findlinks成功束,最的return語句將一組解析得的接返迴給用戶
在findlinks中有4return句,每一return都返了一值。前三returnhttp和html包中的错误信息传递给findlinks的用者。第一return直接返回错误信息,其他两处通过fmt.Errorf§7.8输出详细的错误信息。如果findlinks成功束,最的return语句将一组解析得的接返回给用户
在finallinks中們必須確保resp.Body被關閉,釋放網絡資源。然Go的垃圾迴收機製會迴收不被使用的存,但是不包括操作繫統層面的源,比如打的文件、網絡連接。因此我們必須顯式的釋放這些資源。
在finallinks中们必须确保resp.Body被关闭,释放网络资源。然Go的垃圾回收机制会回收不被使用的存,但是不包括操作系统层面的源,比如打的文件、网络连接。因此我们必须显式的释放这些资源。
調用多返值函數時,返迴給調用者的是一值,調用者必須顯式的將這些值分配給變量:
用多返值函数时,返回给调用者的是一值,用者必须显式的将这些值分配给变量:
```Go
links, err := findLinks(url)
```
如果某值不被使用,可以其分配blank identifier:
如果某值不被使用,可以其分配blank identifier:
```Go
links, _ := findLinks(url) // errors ignored
```
個函數內部可以另一有多返值的函數作爲返迴值,下面的例子展示了findLinks有相同功能的函數,兩者的别在下面的例子先輸出參數
个函数内部可以另一有多返值的函数作为返回值,下面的例子展示了findLinks有相同功能的函数,两者的别在下面的例子先输出参数
```Go
func findLinksLog(url string) ([]string, error) {
@@ -64,7 +64,7 @@ func findLinksLog(url string) ([]string, error) {
}
```
當你調用接受多參數的函數時,可以將一個返迴多參數的函數作爲該函數的參數。雖然這很少出現在實際生産代碼中,但這個特性在debug很方便,我們隻需要一條語句就可以出所有的返值。下面的代是等的:
当你调用接受多参数的函数时,可以将一个返回多参数的函数作为该函数的参数。虽然这很少出现在实际生产代码中,但这个特性在debug很方便,我们只需要一条语句就可以出所有的返值。下面的代是等的:
```Go
log.Println(findLinks(url))
@@ -72,7 +72,7 @@ links, err := findLinks(url)
log.Println(links, err)
```
準確的變量名可以傳達函數返迴值的含。尤其在返值的型都相同,就像下面這樣
准确的变量名可以传达函数返回值的含。尤其在返值的型都相同,就像下面这样
```Go
func Size(rect image.Rectangle) (width, height int)
@@ -80,9 +80,9 @@ func Split(path string) (dir, file string)
func HourMinSec(t time.Time) (hour, minute, second int)
```
然良好的命名很重要,但你也不必每一個返迴值都取一個適當的名字。比如,按照例,函的最後一個bool型的返值表示函是否行成功error型的返值代表函數的錯誤信息,對於這些類似的例,我不必思考合的命名,它們都無需解
然良好的命名很重要,但你也不必每一个返回值都取一个适当的名字。比如,按照例,函的最后一个bool型的返值表示函是否行成功error型的返值代表函数的错误信息,对于这些类似的例,我不必思考合的命名,它们都无需解
如果一個函數將所有的返值都示的量名,那麽該函數的return句可以省略操作數。這稱之爲bare return。
如果一个函数将所有的返值都示的量名,那么该函数的return句可以省略操作数。这称之为bare return。
```Go
// CountWordsAndImages does an HTTP GET request for the HTML
@@ -104,14 +104,14 @@ func CountWordsAndImages(url string) (words, images int, err error) {
func countWordsAndImages(n *html.Node) (words, images int) { /* ... */ }
```
按照返值列表的次序,返所有的返值,在上面的例子中,每一return句等價於
按照返值列表的次序,返所有的返值,在上面的例子中,每一return句等价于
```Go
return words, images, err
```
當一個函數有多return句以及多返迴值時bare return 可以少代的重,但是使得代碼難以被理解。舉個例子,如果你有仔細的審査代碼,很難發現前2return等價於 return 0,0,errGo會將返迴值 words和images在函數體的開始處,根據它們的類型,其初始化0後一處return等價於 return wordsimagenil。基以上原因,不宜度使用bare return。
当一个函数有多return句以及多返回值时bare return 可以少代的重,但是使得代码难以被理解。举个例子,如果你有仔细的审查代码,很难发现前2return等价于 return 0,0,errGo会将返回值 words和images在函数体的开始处,根据它们的类型,其初始化0后一处return等价于 return wordsimagenil。基以上原因,不宜度使用bare return。
**練習 5.5** 實現countWordsAndImages。參考練習4.9如何分
**练习 5.5** 实现countWordsAndImages。参考练习4.9如何分
**練習 5.6** 改gopl.io/ch3/surface (§3.2) 中的corner函數,將返迴值命名,使用bare return。
**练习 5.6** 改gopl.io/ch3/surface (§3.2) 中的corner函数,将返回值命名,使用bare return。