如何将结构分配给接口

时间:2018-06-28 04:08:27

标签: go

这是我的代码:

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并接下来调用它的方法时,使用接口进行编程将是什么样?

2 个答案:

答案 0 :(得分:5)

考虑接口可以存储结构体指向结构体的指针,请确保将ApplicationCache结构体定义为:

type ApplicationCache struct { 
  Cache ICacheEngine
}

请参阅“ Cast a struct pointer to interface pointer in Golang”。

答案 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)
}