構造体フィールドの型変換とインターフェイス
質問:
Go プログラムでは、構造体は、異なる型の複数のフィールドを束ねるユーザー定義のデータ型を定義するために使用されます。しかし、文字列と整数値の両方を格納できる構造体内のフィールドが必要な場合はどうすればよいでしょうか?
答え:
Go の型システムは sum 型をサポートしていません。単一のフィールドに複数の型の値を格納できるようにします。ただし、インターフェイスを使用する回避策があります。インターフェイスはメソッドのセットを定義し、それらのメソッドを実装する任意の型をそのインターフェイスとして使用できます。
このソリューションを実装するには、次のスニペットを検討してください。
type Input interface { ToString() string ToInteger() int } type TestCase struct { Input Input IsValid bool }
この例ではでは、ToString() と ToInteger() という 2 つのメソッドを使用して入力インターフェイスを定義しました。これらのメソッドは、入力値を文字列または整数に変換するために使用されます。 TestCase 構造体には、Input インターフェイスを実装する任意の型を受け入れる入力フィールドが追加されました。
このソリューションを使用するには、Input インターフェイスを実装するカスタム型を定義できます。
type StringInput string func (s StringInput) ToString() string { return string(s) } func (s StringInput) ToInteger() int { return 0 // Error handling omitted for brevity } type IntegerInput int func (i IntegerInput) ToString() string { return strconv.Itoa(int(i)) } func (i IntegerInput) ToInteger() int { return int(i) }
Withこれらのカスタム タイプを使用して、テストケースを作成し、入力フィールドに値を割り当てることができます。
var testCase = TestCase{Input: StringInput("Hello"), IsValid: true} fmt.Println(testCase.Input.ToString()) // Prints "Hello" fmt.Println(testCase.Input.ToInteger()) // Throws error
このアプローチでは、文字列と文字列の両方を保存できます。同じフィールドに整数値を含めるには、カスタム型と変換メソッドを実装する必要がありますが、すべてのケースに適しているわけではありません。
以上がGo の構造体フィールドに文字列と整数値の両方を保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。