ホームページ >バックエンド開発 >Golang >Go で文字列のスライスをインターフェイスのスライスに安全に変換するにはどうすればよいですか?

Go で文字列のスライスをインターフェイスのスライスに安全に変換するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-25 03:42:17834ブラウズ

How Do I Safely Convert a Slice of Strings to a Slice of Interfaces in Go?

Go での型キャストの処理: 文字列のスライスをインターフェイスに変換する

Go では、インターフェイス型を使用して任意の型の値を表現できます。{} 。ただし、質問で説明されているように、これは []interface{} が他の型のスライスと直接同等であることを意味するものではありません。

インターフェイスによる型キャスト

Interface{} は Go の固有の型であり、他の型の値はデータをコピーすることによってのみそれに割り当てることができます。たとえば、文字列のスライスをインターフェイスのスライスに変換するには、各文字列要素を個別にコピーする必要があります。

func stringToInterface(strs []string) []interface{} {
    interfaces := make([]interface{}, len(strs))
    for i, str := range strs {
        interfaces[i] = str
    }
    return interfaces
}

型キャストの例

次の例を考えてみましょう。

package main

import "fmt"

func main() {
    strs := []string{"a", "b", "c"}

    interfaces := stringToInterface(strs)

    fmt.Println("Original slice of strings:", strs)
    fmt.Println("Converted slice of interfaces:", interfaces)
}

出力:

Original slice of strings: [a b c]
Converted slice of interfaces: [a b c]

ここでは、関数 stringToInterface は、文字列のスライスからデータをコピーすることによって、インターフェイスの新しいスライスを作成します。

カスタム型キャスト関数

上記の変換は、次のように一般化することもできます。異なるスライス型間の型キャストを処理するカスタマイズ可能な関数:

func typeCast[T any, U any](slice []T) []U {
    result := make([]U, len(slice))
    for i, v := range slice {
        result[i] = interface{}(v).(U)
    }
    return result
}

この関数は型 T のスライスを受け取り、型 U の新しいスライスを返します。各要素を個別にコピーして、型の安全性を確保します。

代替ソリューション

代わりに、型をカプセル化する事前定義型の使用を検討してください。特定のデータ要件。たとえば、任意のタイプのコレクションを表すカスタム タイプを定義し、[]interface{} の代わりに使用できます。

以上がGo で文字列のスライスをインターフェイスのスライスに安全に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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