2017-03-11 43 views
1

考慮下面的程序:如何使用類型別名接口

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而不是重複的方法簽名的?

回答

3

你在這裏混合兩種不同的東西。一個是你定義了一個函數的類型。當你想要這種類型在另一種類型中時,你需要使用一個結構體。

改變你的代碼到一個可能的解決方案1(不那麼地道GO):

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。所以函數類型與方法定義是不同的。如果你想定義一個字符串作爲方法,那麼它將是相同的。

+0

感謝您的回答。但我不認爲它完全回答了我的問題。可能是我沒有問正確的問題。那麼沒有辦法分享方法簽名?我的問題的重點是我有一個參數大的方法。當我想定義接口和類型時,我可以避免重複它嗎? ?我正在考慮在多個接口和結構中使用它。如果我正確地閱讀它,看起來沒有辦法從您的答覆中實現它。 –

+0

我不認爲在Go中將類型定義爲方法是不可能的。爲什麼要這樣?這樣的混合會使代碼不可讀。 – apxp

+0

感謝您的回答。如果需要,我會按照你的建議使用結構嵌入。 –