这是我的代码:
type ICacheEngine interface {
// ...
}
// implements all methods of ICacheEngine
type RedisCache struct { }
type ApplicationCache struct {
Cache *ICacheEngine
}
func NewRedisCache() *ApplicationCache {
appCache := new(ApplicationCache)
redisCache := new(RedisCache)
appCache.Cache = redisCache // here is an error : can not use *RedisCache as *ICacheEngine
return appCache
}
RedisCache
实现ICacheEngine
的所有方法。我可以将RedisCache
传递给获得ICacheEngine
的方法:
func test(something ICacheEngine) *ICacheEngine {
return &something
}
....
appCache.Cache = test(redisCache)
但是我无法将RedisCache
分配给ICacheEngine
。为什么呢如何避免使用test()
函数?当我将具体类型设置为interface并接下来调用它的方法时,使用接口进行编程将是什么样?
答案 0 :(得分:5)
考虑接口可以存储结构体或指向结构体的指针,请确保将ApplicationCache结构体定义为:
type ApplicationCache struct {
Cache ICacheEngine
}
答案 1 :(得分:0)
此处 clientStruct 正在实现“ ClientInterface ”。
然后将结构分配给接口。
package restclient
import (
"net/http"
)
type clientStruct struct{}
type ClientInterface interface {
Get(string) (*http.Response, error)
}
// assigning the struct to interface
var (
ClientStruct ClientInterface = &clientStruct{}
)
func (ci *clientStruct) Get(url string) (*http.Response, error) {
request, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}
client := http.Client{}
return client.Do(request)
}