ホームページ >バックエンド開発 >Golang >ジェネリックを使用せずに Go でマップ キーを取得する方法は?

ジェネリックを使用せずに Go でマップ キーを取得する方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-07 17:19:12454ブラウズ

How to Retrieve Map Keys in Go Without Generics?

Go でマップ キーを取得する方法

Go では、型固有のパラメーターを持つ関数を使用してマップからキーを取得しようとすると、コンパイル時エラーが発生します。たとえば、マップ キーを取得するために設計された Keys() という名前の関数がある場合、次のエラー メッセージが表示されることがあります。m2 (type map[int]interface {}) を type map[interface {}]interface {} として使用できません。 Keys への引数。これは、Go が厳密に型指定された言語であり、int とinterface{} はデータ型が異なるため、マップ型の map[int]interface{} が map[interface{}]interface{} とは異なるために発生します。

Go にはジェネリックスの不在

一般に信じられていることに反して、Go はジェネリックスをサポートしていません。つまり、定義する機能がありません。明示的な型宣言なしでさまざまな型を操作できる関数またはデータ構造。この設計上の決定は、Go のシンプルさ、効率性、ランタイム エラーへの耐性に貢献します。

マップ キーを取得するためのソリューション

この問題に対処するには、いくつかのオプションがあります。

1.マップ タイプの変更

既存の Keys() 関数を維持したい場合は、マップ タイプを map[interface{}]interface{} に調整できます。これにより、関数が任意のタイプのキーを使用してマップ上で操作できるようになります。

2. Keys() 関数の編集

または、より具体的なマップ タイプ (この場合は、map[int]interface{}) を受け入れるように Keys() 関数を変更することもできます。

3.リフレクションの使用

パフォーマンス上の理由から推奨されませんが、リフレクト パッケージを利用してマップを操作し、リフレクションを通じてキーを取得できます。

サンプル コード

最初の 2 つを示すサンプル コード スニペットは次のとおりです。解決策:

汎用キータイプによるマップの使用:

package main

import "fmt"

func main() {
    m2 := map[interface{}]interface{}{
        2: "string",
        3: "int",
    }
    fmt.Println(Keys(m2))
}

func Keys(m map[interface{}]interface{}) []interface{} {
    // ... (code as before)
}

Keys() 関数の編集:

package main

import "fmt"

func main() {
    m2 := map[int]interface{}{
        2: "string",
        3: "int",
    }
    fmt.Println(Keys(m2))
}

func Keys(m map[int]interface{}) []int {
    // ... (code as before)
}

以上がジェネリックを使用せずに Go でマップ キーを取得する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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