ホームページ >バックエンド開発 >Golang >ジェネリック関数での Go の「型パラメーター V を推論できません」エラーを解決するにはどうすればよいですか?

ジェネリック関数での Go の「型パラメーター V を推論できません」エラーを解決するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-31 09:26:10251ブラウズ

How to Resolve Go's

型パラメータ V を推論できません

次の Go コードを考えてみましょう:

package cfgStorage

type WritableType interface {
    ~int | ~string | ~float64
}

type ConfigStorage[K, V WritableType] interface {
    get(key K) (V, error)
    set(key K, value V) (bool, error)
}

func GetValue[K, V WritableType, C ConfigStorage[K, V]](storage C, key K) (V, error) {
    res, err := storage.get(key)
    return res, err
}

func SetValue[K, V WritableType, C ConfigStorage[K, V]](storage C, key K, value V) (bool, error) {
    res, err := storage.set(key, value)
    return res, err
}

type FileSystemStorage[K, V WritableType] struct {
}

func (f FileSystemStorage[K, V]) get(key K) (V, error) {
    /// my code to load data from json file
}

func (f FileSystemStorage[K, V]) set(key K, value V) (bool, error) {
/// my code to save data as json file
}

func main() {
    var fileStorage cfgStorage.FileSystemStorage[string, string]

    setResult, _ := cfgStorage.SetValue(fileStorage, "key", "value")
    if setResult == false {
        log.Fatal("Error setting value")
    }
    var result string

    result, _ = cfgStorage.GetValue(fileStorage, "key")
    fmt.Println(result)
}

GetValue 関数を呼び出すとき、 Go コンパイラは次のように報告します。 error:

cannot infer V

Cause

Go 1.20 以前では、型推論アルゴリズムは、指定された引数 storage と key のみに基づいて V の型を推定できません。制約型推論ルールを使用すると、既知の型引数から未知の型引数を推定できます。ただし、この場合、ConfigStorage[K, V] 制約を満たす具体的な型は不明です。

解決策

この問題を解決するには、明示的な型パラメーターを使用します。 GetValue を呼び出すときに指定する必要があります:

result, _ = GetValue[string, string](fileStorage, "key")

Go 1.21

Go 1.21 では、値がインターフェイスに割り当てられるときにメソッドを考慮するように型推論アルゴリズムが強化されました。これは、メソッド シグネチャで使用される型パラメータを、一致するメソッドの対応するパラメータ型から推測できることを意味します。その結果、Go 1.21 以降では、型パラメータを明示的に指定せずに、

result, _ = GetValue(fileStorage, "key")

を呼び出すだけで済みます。

以上がジェネリック関数での Go の「型パラメーター V を推論できません」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。