-3
func GetResult (service interface{}) {
   switch v := service.(type) {
     case services.Account:
       service = service.(services.Account)
     default:
       service = service.(Mock_Account)
    }
   res, err := service.GetAccount()
 }

サービスはインターフェイスのタイプであり、メソッドはありません。型キャストが機能していません GetAccount メソッドを呼び出す方法はありますか?

4

1 に答える 1

3

コード サンプルに注釈を付けるには:

func GetResult (service interface{}) {
    // service is of type interface{}
    switch v := service.(type) {
    case services.Account:
        // This does nothing: it assigns the existing value back into service, which is still of type interface{}
        // v exists in scope and is of type services.Account, but it's unused.
        service = service.(services.Account)
    default:
        // Ditto
        service = service.(Mock_Account)
    }
    // service is still of type interface{}, which defines no methods
    res, err := service.GetAccount()
}

ご覧のとおり、serviceここの変数は常にtypeinterface{}です。変数の型は変更できません: Go はstatic typedです。ただし、渡された型でメソッドを呼び出したいだけの場合はGetAccount、型アサーションを使用せずに、インターフェイスを宣言することで完全な型の安全性を確保して実行できます。

type AccountGetter interface {
    GetAccount() (res ResultType, err error)
}

func GetResult(service AccountGetter) {
    res,err := service.GetAccount()
}

次に、適切なシグネチャを持つメソッドを実装する 、、または任意の型を呼び出しGetResultて渡すことができます。services.AccountMock_AccountGetAccount

于 2018-05-31T18:13:01.380 に答える