コード サンプルに注釈を付けるには:
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.Account
Mock_Account
GetAccount