Go學習筆記(九)介面,錯誤處理
阿新 • • 發佈:2019-02-02
介面
提供了另外一種資料型別即介面,它把所有的具有共性的方法定義在一起,任何其他型別只要實現了這些方法就是實現了這個介面。
package main
import (
"fmt"
)
type Phone interface {
call()
}
type NokiaPhone struct {
}
func (nokiaPhone NokiaPhone) call() {
fmt.Println("I am Nokia, I can call you!")
}
type IPhone struct {
}
func (iPhone IPhone) call() {
fmt.Println("I am iPhone, I can call you!" )
}
func main() {
var phone Phone
phone = new(NokiaPhone)
phone.call()
phone = new(IPhone)
phone.call()
}
例子中,定義了一個介面Phone,接口裡面有一個方法call()。然後在main函式裡面定義了一個Phone型別變數,並分別為之賦值為NokiaPhone和IPhone。然後呼叫call()方法,輸出結果如下:
I am Nokia, I can call you!
I am iPhone, I can call you!
錯誤處理
通過內建的錯誤介面提供了非常簡單的錯誤處理機制。
package main
import (
"fmt"
)
// 定義一個 DivideError 結構
type DivideError struct {
dividee int
divider int
}
// 實現 `error` 介面
func (de *DivideError) Error() string {
strFormat := `
Cannot proceed, the divider is zero.
dividee: %d
divider: 0
`
return fmt.Sprintf(strFormat, de.dividee)
}
// 定義 `int` 型別除法運算的函式
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
if varDivider == 0 {
dData := DivideError{
dividee: varDividee,
divider: varDivider,
}
errorMsg = dData.Error()
return
} else {
return varDividee / varDivider, ""
}
}
func main() {
// 正常情況
if result, errorMsg := Divide(100, 10); errorMsg == "" {
fmt.Println("100/10 = ", result)
}
// 當被除數為零的時候會返回錯誤資訊
if _, errorMsg := Divide(100, 0); errorMsg != "" {
fmt.Println("errorMsg is: ", errorMsg)
}
}
輸出結果為:
100/10 = 10
errorMsg is:
Cannot proceed, the divider is zero.
dividee: 100
divider: 0