對Golang interface的理解

理解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兩個結(jié)構(gòu)體分別實現(xiàn)了接口中定義的方法。當interface{}作為函數(shù)形參時,可以接受不同類型的參數(shù)。

指針與interface

如果將上述代碼的:

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

修改為:

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

再次運行源代碼,就會出現(xiàn)以下錯誤:

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并未實現(xiàn)Speak()方法, 而是由 *Cat 實現(xiàn)的。這說明結(jié)構(gòu)體在實現(xiàn)接口方法時并不會隱式轉(zhuǎn)換類型。

interface 數(shù)組

interface{} 作為函數(shù)形參和 []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

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

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)
}

以上是關(guān)于interface使用的基礎(chǔ)內(nèi)容。

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

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,675評論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,001評論 25 709
  • 這是一個晴朗的日子。 羅德深和高德爽打了一架。原因是兩家的狗打了一架。人仗狗勢,兩人打了起來。 羅德深是屠夫。吃肉...
    scumalapert閱讀 252評論 0 0
  • HSET命令可以設(shè)置hash中一個field的值: HGET命令可以獲取hash中一個field的值: HMSET...
    yingzong閱讀 334評論 0 0

友情鏈接更多精彩內(nèi)容