结构体字段中的类型转换和接口
问题:
在 Go 程序中,结构体用于定义用户定义的数据类型,该数据类型将多个不同类型的字段捆绑在一起。但是,如果您希望结构体中的字段可以同时存储字符串和整数值怎么办?
答案:
Go 的类型系统不支持 sum 类型,这会导致允许单个字段存储多种类型的值。但是,有一个使用接口的解决方法。接口定义了一组方法,任何实现这些方法的类型都可以用作该接口。
要实现此解决方案,请考虑以下代码片段:
type Input interface { ToString() string ToInteger() int } type TestCase struct { Input Input IsValid bool }
在此示例中中,我们定义了Input接口,有两个方法ToString()和ToInteger(),它们用于将Input值转换为字符串或整数。 TestCase 结构现在有一个输入字段,它接受任何实现输入接口的类型。
要使用此解决方案,您可以定义实现输入接口的自定义类型:
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) }
与这些自定义类型,您可以创建一个测试用例并将值分配给输入字段:
var testCase = TestCase{Input: StringInput("Hello"), IsValid: true} fmt.Println(testCase.Input.ToString()) // Prints "Hello" fmt.Println(testCase.Input.ToInteger()) // Throws error
虽然这种方法允许您存储字符串和同一字段中的整数值,需要实现自定义类型和转换方法,这可能并不适合所有情况。
以上是如何在 Go 的结构体字段中存储字符串和整数值?的详细内容。更多信息请关注PHP中文网其他相关文章!