【问题标题】:How to change type of variable in runtime [duplicate]如何在运行时更改变量类型
【发布时间】: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)conversions someType(someValue)
  • ... 并澄清我的 "no dynamic type cast in go" 评论,当您进行类型断言时,即v.(T)T in该表达式必须是有效的 go 类型,而不是包含某个值的变量,不是导致某个值的表达式等。也就是说,您可以执行 v.(int)v.(string),但您不能执行 v.(getIntType()) 或 @ 987654335@.

标签: go struct types


【解决方案1】:

如何在运行时改变变量的类型

你不能。

【讨论】:

  • 这很奇怪,这个决定背后有什么原因吗?因为强迫语言用户阅读巨大的 switch 语句似乎更麻烦(至少对用户而言)
  • @celoxxx 原因是希望提供类型安全。许多开发人员更喜欢类型安全,而不是不知道变量的类型是什么。
猜你喜欢
  • 1970-01-01
  • 2020-07-12
  • 2022-01-12
  • 2011-02-24
  • 2021-12-20
  • 1970-01-01
  • 2020-05-15
相关资源
最近更新 更多