1. ホーム
  2. go

[解決済み] Golang 構造体へのキャストインターフェイス

2022-03-05 21:59:16

質問

ある構造体の関数/メソッドを取得しようとしていますが、パラメータとしてインターフェイスを使用しており、このインターフェイスを使用して構造体の関数にアクセスしようとしています。私が欲しいものを示すために、以下は私のコードです。

// 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
}

解決方法は?

あなたの Connection インターフェイスになります。

type Connection interface {
    GetClient() (*redis.Client, error)
}

があるというだけです。 GetClient メソッドをサポートすることについては何も書いていません。 GetValue .

を呼び出したい場合 GetValue の上に Connection このように

func GetRedisValue(c Connection, key string) (string, error) {
    value, err := c.GetValue(key)
    return value, err
}

を指定した場合は GetValue をインターフェースに追加します。

type Connection interface {
    GetClient() (*redis.Client, error)
    GetValue(string) (string, error) // <-------------------
}

今、あなたが言っているのは、すべての Connection をサポートします。 GetValue メソッドを使用します。