Go語言 函數類型實現接口——把函數作為接口來調用實例


  其他類型能夠實現接口,函數也可以,本節將對結構體與函數實現接口的過程進行對比。

  完整的代碼:

package main

import "fmt"

/*
這個接口需要實現 Call() 方法,調用時會傳入一個 interface{} 類型的變量,這種類型的變量表示任意類型的值。
*/
type Invoker interface {
    //調用器接口
    Call(interface{})
}

/*
定義結構體,該例子中的結構體無須任何成員,主要展示實現 Invoker 的方法。
*/
type Struct struct {
}

/*
Call() 為結構體的方法,該方法的功能是打印 from struct 和傳入的 interface{} 類型的值。
*/
func (s *Struct) Call(p interface{}) {
    fmt.Println("from struct", p)
}

//函數定義為類型
type FuncCaller func(interface{})

/*
將 func(v interface{}){} 匿名函數轉換為 FuncCaller 類型(函數簽名才能轉換),此時 FuncCaller 類型實現了 Invoker 的 Call() 方法,賦值給 invoker 接口是成功的
*/
func (f FuncCaller) Call(p interface{}) {
    f(p)
}

func main() {
    //聲明接口變量
    var invoker Invoker

    /*
        使用 new 將結構體實例化,此行也可以寫為 s:=&Struct。
    */
    s := new(Struct)
    //將實例化的結構體賦值到接口
    invoker = s
    //使用接口調用實例化結構體方法
    invoker.Call("hello")
    //將匿名函數轉為FuncCaller類型,再賦值給接口
    invoker = FuncCaller(func(v interface{}) {
        fmt.Println("from function", v)
    })
    //使用接口調用FuncCaller.Call,內部會調用 函數主體
    invoker.Call("hello")
}

 

  程序輸出:

from struct hello
from function hello

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM