2015-09-04 80 views
0
// Each type have Error() string method. 
// The error built-in interface type is the conventional interface for 
// representing an error condition, with the nil value representing no error. 
// type error interface { 
// Error() string 
// } 

func (f binFunc) Error() string { 
    return "binFunc error" 
} 

func func_type_convert() { 
    var err error 
    err = binFunc(add) 
    fmt.Println(err) 
    fmt.Println(i) 
} 

我對上面的代碼中的兩個問題:轉換功能型Golang

  • 我不知道爲什麼Error方法執行,當add功能轉化爲binFunc類型?
  • 爲什麼add函數的轉換結果能夠分配給err錯誤接口變量?
+4

請提供更詳細的示例,請使用https://play.golang.org/。我只是不理解你。什麼是'add',什麼是'binFunc'? – RoninDev

回答

5

error是一個接口:

type error interface { 
    Error() string 
} 

這意味着,有一個方法的任何類型的:Error() string滿足接口和可被分配給error類型的變量。

binFunc有這樣的方法:

func (f binFunc) Error() string { 
    return "binFunc error" 
} 

在進入新的開發者有時會覺得迷惑,因爲他們不知道這是可能的方法重視的不僅僅是結構更多。在這種情況下binFunc定義喜歡這樣的:

type binFunc func(int, int) int 

所以這個工作的方式是你被允許轉換具有相同簽名的任何功能:(從spec

函數類型表示具有相同參數和結果類型的所有函數的集合。

因此,如果你創建一個函數add

func add(x, y int) int { 
    return x + y 
} 

你被允許將其轉換成binFunc

binFunc(add) 

因爲binFunc我們上面定義的Error方法和,我們然後可以將這個新的binFunc分配給error類型的變量:

var err error 
var bf binFunc = binFunc(add) 
err = bf 

fmt.Println的行爲是調用.Error()上錯誤for you

  • 如果操作數實現了錯誤接口,Error方法將被調用以轉換將對象轉換爲字符串,然後根據動詞的要求對其進行格式設置(如果有的話)。
  • 因此,要回答你的問題:執行

    • Error方法,因爲fmt.Println查找error類型的參數,調用.Error()並打印生成的字符串。
    • 您可以將binFunc s分配到err,因爲binFunc有一個Error方法。您不能將add直接分配給err,因爲它沒有Error方法。但是您可以將add轉換爲binFunc,因爲它們具有相同的功能簽名,通過這樣做,您可以將其分配給err變量。
    +1

    很好的解釋,謝謝 – christian