考虑以下计划:
package main
import (
"fmt"
)
type MyMethod func(i int, j int, k int) (string, error)
type MyInterface interface {
Hello(i int, j int, k int) (string, error)
}
type myMethodImpl struct {}
func (*myMethodImpl) Hello(i int, j int, k int) (string, error) {
return fmt.Sprintf("%d:%d:%d\n", i, j, k), nil
}
func main() {
var im MyInterface = &myMethodImpl{}
im.Hello(0, 1, 2)
}
如何在界面声明中使用MyMethod而不是重复方法签名?
答案 0 :(得分:3)
你在这里混合了两件不同的东西。一个是你定义一个函数类型。如果您希望在另一种类型中使用该类型,则需要使用结构。
将代码更改为可能的解决方案1(不是那么惯用):
type MyMethod func(i int, j int, k int) (string, error)
type myMethodImpl struct {
Hello MyMethod
}
var hello MyMethod = func(i int, j int, k int) (string, error) {
return fmt.Sprintf("%d:%d:%d\n", i, j, k), nil
}
func main() {
im := &myMethodImpl{Hello: hello}
fmt.Println(im.Hello(0, 1, 2))
}
https://play.golang.org/p/MH-WOnj-Mu
另一种解决方案是将其更改为使用界面。该解决方案是您的代码,没有MyMethod的类型定义。 https://play.golang.org/p/nGctnTSwnC
但是有什么区别?
如果在创建函数时将func定义为需要声明它的类型。
var hello MyMethod = func(i int, j int, k int) (string, error) {
return fmt.Sprintf("%d:%d:%d\n", i, j, k), nil
}
现在hello
的确属于MyMethod
类型。如果还有其他类型,例如:
type YourMethod func(i int, j int, k int) (string, error)
hello
仍然只是MyMethod
类型。
要定义界面,您需要method set。但类型MyMethod
不是一种方法。它只是一个function type。所以函数类型与方法定义不同。如果您想将字符串定义为方法,那么它将是相同的。