
功能与其他类型一样,是“一等公民”. 其他类型可以实现接口和功能. 本节将比较实现结构和功能之间的接口的过程.
首先提供本节的完整代码:
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")
}
有一个如下界面:

// 调用器接口
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)
}

代码说明如下:
实例化定义的Struct类型并将其调用到接口中,代码如下:
// 声明接口变量
var invoker Invoker
// 实例化结构体
s := new(Struct)
// 将实例化的结构体赋值到接口
invoker = s
// 使用接口调用实例化结构体的方法Struct.Call
invoker.Call("hello")
代码说明如下:
接下来,比较一下函数实现结构的差异.
代码输出如下:
来自struct hello
功能体实现接口. 函数声明不能直接实现接口. 在将函数定义为类型之后,该类型用于实现结构. 调用类型方法时,需要调用函数体.

// 函数定义为类型
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
考验党维护祖国领土不受外来侵略的时候到了