【发布时间】:2019-05-23 15:58:44
【问题描述】:
我想知道是否可以在运行时更改变量的类型,例如:
package main
import "github.com/fatih/structs"
type T struct {
MyField bool
}
func main() {
fakeVariable := ""
s := structs.New(T{})
for _, field := range s.Fields() {
field.Set(fakeVariable)
}
}
由于 MyField 是布尔值,我想将 fakeVariable 更改为布尔值,预期结果将是 MyField 为假(因为空字符串为假)。但是 MyField 类型可以是任何类型,所以我想知道如何将其转换为 MyField 的类型。我知道我可以使用field.Kind() 获取字段类型,并且:
field.Set(fakeVariable.(field.Kind())
不会工作。
fakeVariable 将始终是一个字符串,但它可以保存值“10.0”,如果 MyField 的类型是 float,它应该转换为浮点数,但如果它是字符串,它应该只分配它.有意义吗?
如果我正在尝试的任何想法是可能的?
【问题讨论】:
-
类似
if field is bool then field.Set(fakeVariable != "")? -
我试图避免使用条件,例如 `field.Set(fakeVariable.(field.Kind()) - 一种动态类型转换。
-
go 中没有动态类型转换,使用条件。顺便说一句,如果你想用你的语言精确,那么 go 中没有“类型转换”,只有 type assertions
someValue.(someType)和 conversionssomeType(someValue)。 -
... 并澄清我的 "no dynamic type cast in go" 评论,当您进行类型断言时,即
v.(T),Tin该表达式必须是有效的 go 类型,而不是包含某个值的变量,不是导致某个值的表达式等。也就是说,您可以执行v.(int)或v.(string),但您不能执行v.(getIntType())或 @ 987654335@.