Типизация интерфейса не работает - PullRequest
0 голосов
/ 31 мая 2018
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?

1 Ответ

0 голосов
/ 31 мая 2018

Чтобы прокомментировать пример кода:

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 здесь равна всегда типа interface{}.Тип переменной не может быть изменен: Go - статический тип .Однако, если вы просто хотите вызвать метод GetAccount для любого передаваемого вами типа, это можно сделать без утверждений типа и с полной безопасностью типов, объявив интерфейс:

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

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

Вы можетезатем вызовите GetResult и передайте services.Account или Mock_Account или любой тип, который реализует метод GetAccount с соответствующей подписью.

...