對Golang interface的理解

原文:http://www.itdecent.cn/p/291d2c1da548?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com

理解golang的interface主要在于以下兩點:

  • interface是方法的集合
  • interface是一種類型

簡單示例

package main

import "fmt"

type Animal interface {
    Speak() string
}

type Cat struct{}
func (c Cat) Speak() string {
    return "cat"
}

type Dog struct{}
func (d Dog) Speak() string {
    return "dog"
}

func Test(params interface{}) {
    fmt.Println(params)
}

func main() {
    animals := []Animal{Cat{}, Dog{}}
    for _, animal := range animals {
        fmt.Println(animal.Speak())
    }

        Test("string")
    Test(123)
    Test(true)
}

以上代碼中,定義了Animal為接口,而Cat和Dog兩個結構體分別實現了接口中定義的方法。當interface{}作為函數形參時,可以接受不同類型的參數。

指針與interface

如果將上述代碼的:

func (c Cat) Speak() string {
    return "cat"
}

修改為:

func (c *Cat) Speak() string {
    return "cat"
}

再次運行源代碼,就會出現以下錯誤:

cannot use Cat literal (type Cat) as type Animal in array or slice literal:
Cat does not implement Animal (Speak method has pointer receiver)

這是因為程序認為Cat并未實現Speak()方法, 而是由 *Cat 實現的。這說明結構體在實現接口方法時并不會隱式轉換類型。

interface 數組

interface{} 作為函數形參和 []interface{} 作為形參有很大區(qū)別,示例如下:

package main

import (
    "fmt"
)

func PrintAll(vals []interface{}) {
    for _, val := range vals {
        fmt.Println(val)
    }
}

func main() {
    names := []string{"stanley", "david", "oscar"}
    PrintAll(names)
}

以上代碼是無法正常運行的,錯誤提示為:

cannot use names (type []string) as type []interface {} in argument to PrintAll

這說明對接口數組賦值前,必須多一個類型轉換操作,正確代碼如下:

package main

import (
    "fmt"
)

func PrintAll(vals []interface{}) {
    for _, val := range vals {
        fmt.Println(val)
    }
}

func main() {
    names := []string{"stanley", "david", "oscar"}
    vals := make([]interface{}, len(names))
    for i, v := range names {
        vals[i] = v
    }
    PrintAll(vals)
}

以上是關于interface使用的基礎內容。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容