1. 程式人生 > >Go學習筆記(九)介面,錯誤處理

Go學習筆記(九)介面,錯誤處理

介面

提供了另外一種資料型別即介面,它把所有的具有共性的方法定義在一起,任何其他型別只要實現了這些方法就是實現了這個介面。

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