在Go语言中,有没有一种方法可以匿名地满足一个接口?看起来没有,但这是我最好的尝试。
(In Playground)
package main
import "fmt"
type Thing interface {
Item() float64
SetItem(float64)
}
func newThing() Thing {
item := 0.0
return struct {
Item (func() float64)
SetItem (func(float64))
}{
Item: func() float64 { return item },
SetItem: func(x float64) { item = x },
}
}
func main() {
thing := newThing()
fmt.Println("Hello, playground")
fmt.Println(thing)
}
4条答案
按热度按时间5kgi1eie1#
Go语言使用方法集来声明哪些方法属于一个类型,只有一种方法可以声明接收方类型(方法)的函数:
因为嵌套函数是被禁止的,所以无法在匿名结构上定义方法集。
第二点是方法是只读的,引入方法值是为了允许传递方法并在goroutine中使用它们,但不允许操作方法集。
您可以做的是提供一个ProtoThing并引用匿名结构体(on play)的底层实现:
这是因为通过嵌入
ProtoThing
继承了方法集,因此匿名结构体也满足Thing
接口。n3ipq98p2#
下面是用匿名函数满足接口的简洁方法。
Playground:https://play.golang.org/p/k8_X9g2NYc
nb,看起来http包中的HandlerFunc使用了这个模式:https://golang.org/pkg/net/http/#HandlerFunc
编辑:为清晰起见,将类型DoThing更改为DoThingWith。更新Playground
hgc7kmma3#
你不能用方法示例化一个结构体,它们需要被声明为函数,但是在Go语言中函数是“第一类公民”,所以它们可以像在JavaScript中一样是字段值(但是有类型)。
您可以创建一个接受func字段的泛型结构来实现该接口:
3vpjnl9f4#
我是在研究典型的http中间件实现如何返回一个
http.Handler
接口,而不为它返回的匿名函数定义一个ServeHTTP
方法时想到这里的。这里,匿名函数被转换为
HandlerFunc
类型以满足接口要求:http.HandlerFunc(fn)
个尽管匿名函数并不通过实现
ServeHTTP
方法直接实现Handler
接口本身,但它转换成的HandlerFunc类型确实实现了ServeHTTP
方法。下面是一个简单的操场例子:https://play.golang.org/p/JX0hrcXyj6Q