b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Go语言函数类型实现接口-将该函数作为接口调用

电脑杂谈  发布时间:2020-06-14 08:19:32  来源:网络整理

c语言实现接口_go 实现webide_go 语言接口实现

功能与其他类型一样,是“一等公民”. 其他类型可以实现接口和功能. 本节将比较实现结构和功能之间的接口的过程.

首先提供本节的完整代码:

package main
import (
    "fmt"
)
// 调用器接口
type Invoker interface {
    // 需要实现一个Call方法
    Call(interface{})
}
// 结构体类型
type Struct struct {
}
// 实现Invoker的Call
func (s *Struct) Call(p interface{}) {
    fmt.Println("from struct", p)
}
// 函数定义为类型
type FuncCaller func(interface{})
// 实现Invoker的Call
func (f FuncCaller) Call(p interface{}) {
    // 调用f函数本体
    f(p)
}
func main() {
    // 声明接口变量
    var invoker Invoker
    // 实例化结构体
    s := new(Struct)
    // 将实例化的结构体赋值到接口
    invoker = s
    // 使用接口调用实例化结构体的方法Struct.Call
    invoker.Call("hello")
    // 将匿名函数转为FuncCaller类型,再赋值给接口
    invoker = FuncCaller(func(v interface{}) {
        fmt.Println("from function", v)
    })
    // 使用接口调用FuncCaller.Call,内部会调用函数本体
    invoker.Call("hello")
}

有一个如下界面:

go 实现webide_c语言实现接口_go 语言接口实现

// 调用器接口
type Invoker interface {
    // 需要实现一个Call()方法
    Call(interface{})
}

此接口需要实现Call()方法. 调用时go 语言接口实现,将传入interface {}类型的变量. 此类型的变量表示任何类型的值.

接下来go 语言接口实现,使用该结构实现接口. 结构实现接口该结构实现Invoker接口代码,如下所示:

// 结构体类型
type Struct struct {
}
// 实现Invoker的Call
func (s *Struct) Call(p interface{}) {
    fmt.Println("from struct", p)
}

go 实现webide_c语言实现接口_go 语言接口实现

代码说明如下:

实例化定义的Struct类型并将其调用到接口中,代码如下:

// 声明接口变量
var invoker Invoker
// 实例化结构体
s := new(Struct)
// 将实例化的结构体赋值到接口
invoker = s
// 使用接口调用实例化结构体的方法Struct.Call
invoker.Call("hello")

代码说明如下:

go 语言接口实现_c语言实现接口_go 实现webide

接下来,比较一下函数实现结构的差异.

代码输出如下:

来自struct hello

功能体实现接口. 函数声明不能​​直接实现接口. 在将函数定义为类型之后,该类型用于实现结构. 调用类型方法时,需要调用函数体.

go 语言接口实现_c语言实现接口_go 实现webide

// 函数定义为类型
type FuncCaller func(interface{})
// 实现Invoker的Call
func (f FuncCaller) Call(p interface{}) {
    // 调用f()函数本体
    f(p)
}

代码说明如下:

上面的代码仅定义函数类型,并且函数本身需要进行逻辑处理. FuncCaller不需要实例化. 它只需要将函数转换为FuncCaller类型. 该函数的源可以是命名函数,匿名函数或闭包,请参见下面的代码:

// 声明接口变量
var invoker Invoker
// 将匿名函数转为FuncCaller类型, 再赋值给接口
invoker = FuncCaller(func(v interface{}) {
    fmt.Println("from function", v)
})
// 使用接口调用FuncCaller.Call, 内部会调用函数本体
invoker.Call("hello")

代码说明如下:

代码输出如下:

来自函数hello


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-244800-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 王地
        王地


      • 韩双江
        韩双江

        考验党维护祖国领土不受外来侵略的时候到了

      热点图片
      拼命载入中...