如何在界面中使用类型别名

时间:2017-03-11 05:36:43

标签: go

考虑以下计划:

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而不是重复方法签名?

1 个答案:

答案 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。所以函数类型与方法定义不同。如果您想将字符串定义为方法,那么它将是相同的。