iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 17
1
Software Development

Golang入門到進階實戰系列 第 17

Day17 Interface接口

interface

定義

type <Example> interface{
    <method>() <rtype>
    ...
}

interface是一種類型,更準確的說,interface是一個擁有方法的抽象類型。

Go語言允許不帶任何方法的interface,這種類型的接口叫做interface。

Go在抽象類型的實現採用鴨子模式,如果有個動物長得像鴨子,叫得像鴉子,走起來也像鴨子,那牠就是鴨子。若有一個結構體實現了interface的所有方法,它也就實現了該接口。所有結構體都實現了emptyinterface,因為任何類型至少實現了0個方法。

應用

// 定義People接口
type People interface {    
    Get() int
    Set(int)
}

// Person 結構體實現 People 接口
type Person struct {
    Age int
}

func(p Person) Get()int {
    return p.Age
}

func(p *Person) Set(age int) {
    p.Age = age
}

func foo(p People){
    p.Set(10)
    fmt.Println(p.Get())
}

func main() {
    p := Person{} 
    foo(&p)  
}

上面的代碼定義了 People接口,並且實作一個Person結構體實現People接口,接口的重要性體現在函數foo的調用上,在函數調用時Go語言會自動進行類型的轉換,假如結構體實現了多個接口,Go也會在調用時將結構體的類型轉換成相應的接口類型。

判斷接口類型

當一個接口被多個類型實現時,有時候我們需要區分接口的變量究竟存儲哪種類型的值。

此時我們可以使用

value, ok := <variable>.(*<struct name>)

的方式做為判斷依據,當ok為true時表示變數儲存的是該struct類型的值,這種區分方式稱為 Type assertions。

當我們需要區分多種類型時,則可以使用switch case語法。

empty interface

interface{}是一個空的 interface 類型,我們知道所有的類型在實現了空的interface,因此當我們求義一個函數的參數為 interface{}類型,該函數就可以接受任何類型作為它的參數。

func doSomething(interface{}){    
}

上一篇
Day16 Go語言的物件導向(2)
下一篇
Day 18 常用基本庫介紹
系列文
Golang入門到進階實戰30

尚未有邦友留言

立即登入留言