patterngoMinor
Golang Cast interface to struct
Viewed 0 times
castinterfacegolangstruct
Problem
Hi I'm trying to retrieve the function/method of one struct but I'm using an interface as parameter and using this interface I'm trying to access the function of the struct. To demonstrate what I want below is my code
// Here I'm trying to use "GetValue" a function of RedisConnection but since "c" is an interface it doesn't know that I'm trying to access the RedisConnection function. How Do I fix this?
func GetRedisValue(c Connection, key string) (string, error) {
value, err := c.GetValue(key)
return value, err
}
// Connection ...
type Connection interface {
GetClient() (*redis.Client, error)
}
// RedisConnection ...
type RedisConnection struct {}
// NewRedisConnection ...
func NewRedisConnection() Connection {
return RedisConnection{}
}
// GetClient ...
func (r RedisConnection) GetClient() (*redis.Client, error) {
redisHost := "localhost"
redisPort := "6379"
if os.Getenv("REDIS_HOST") != "" {
redisHost = os.Getenv("REDIS_HOST")
}
if os.Getenv("REDIS_PORT") != "" {
redisPort = os.Getenv("REDIS_PORT")
}
client := redis.NewClient(&redis.Options{
Addr: redisHost + ":" + redisPort,
Password: "", // no password set
DB: 0, // use default DB
})
return client, nil
}
// GetValue ...
func (r RedisConnection) GetValue(key string) (string, error) {
client, e := r.GetClient()
result, err := client.Ping().Result()
return result, nil
}Solution
Your
only says that there is a
If you want to call
then you should include
Now you're saying that all
Connection interface:type Connection interface {
GetClient() (*redis.Client, error)
}only says that there is a
GetClient method, it says nothing about supporting GetValue.If you want to call
GetValue on a Connection like this:func GetRedisValue(c Connection, key string) (string, error) {
value, err := c.GetValue(key)
return value, err
}then you should include
GetValue in the interface:type Connection interface {
GetClient() (*redis.Client, error)
GetValue(string) (string, error) // <-------------------
}Now you're saying that all
Connections will support the GetValue method that you want to use.Code Snippets
type Connection interface {
GetClient() (*redis.Client, error)
}func GetRedisValue(c Connection, key string) (string, error) {
value, err := c.GetValue(key)
return value, err
}type Connection interface {
GetClient() (*redis.Client, error)
GetValue(string) (string, error) // <-------------------
}Context
Stack Overflow Q#50939497, score: 13
Revisions (0)
No revisions yet.