2013-10-31 43 views
2

在下面的代碼去教程經常看到:如何使功能支持一個或兩個返回值

a := foo() 
b, c := foo() 

或實際上我看到的是:

m["Answer"] = 48 
a := m["Answer"] 
v, ok := m["Answer"] 

多少FOO()被定義?

它是兩個,一個有一個返回類型,另一個有兩個返回類型?

或者只是一個foo()有兩個返回類型定義,並且在某種程度上神奇地只需要一個返回值(a := foo())時,另一個返回值被忽略?

我試圖

package main 

func main() { 
    a := foo() 
    a = 1 
} 

func foo() (x, y int) { 
    x = 1 
    y = 2 
    return 
} 

func foo() (y int) { 
    y = 2 
    return 
} 

但我得到錯誤信息foo redeclared in this block

回答

7

雖然一些內置的操作支持單個或多個返回值模式(如從地圖,類型的斷言,或使用在循環的範圍內關鍵字讀取),此功能是不可用的用戶定義的函數。

如果你想要一個函數的兩個版本具有不同的返回值,你需要給它們不同的名字。

3

Effective Go教程有一些這方面的有用信息。

基本上,一個函數定義了它返回的有多少個值,它是return語句,它是函數簽名。

要忽略一個或多個返回的值,應該使用the Blank Identifier,_(Underscore)。

例如:

package main 

import "fmt" 

func singleReturn() string { 
    return "String returned" 
} 

func multiReturn() (string, int) { 
    return "String and integer returned", 1 
} 

func main() { 
    s := singleReturn() 
    fmt.Println(s) 
    s, i := multiReturn() 
    fmt.Println(s, i) 
} 

Playground

你給的是「逗號,確定」成語(在上面的有效圍棋鏈接還描述)的一個例子的v, ok := m["answer"]例子。鏈接的文檔使用類型斷言爲例它的使用:

要提取,我們知道的是在價值,我們可以寫入字符串:

str := value.(string) 

但是,如果事實證明該值不包含字符串,則程序將因運行時錯誤而崩潰。爲了防止的是,用「逗號,確定」成語測試,安全,值是否是一個字符串:

str, ok := value.(string) 
if ok { 
    fmt.Printf("string value is: %q\n", str) 
} else { 
    fmt.Printf("value is not a string\n") 
} 

如果類型斷言失敗,海峽仍然存在並且是字符串類型,但它將具有零值,一個空字符串。

相關問題