我有一个包含许多字段的结构-我已经弄清楚了如何使用反射来提取字段名称,值和标签信息。我还想确定一个字段的值是否不同于该字段的默认值。
目前,我有这个(有效,但有点臭):
...
qsMap := make(map[string]interface{})
var defaultTime time.Time
var defaultString string
...
// get the field name and value
fieldName := s.Type().Field(i).Tag.Get("bson")
fieldValue := valueField.Interface()
// use reflection to determine the TYPE of the field and apply the proper formatting
switch fieldValue.(type) {
case time.Time:
if fieldValue != defaultTime {
qsMap[fieldName] = fieldValue
}
case string:
if fieldValue != defaultString {
qsMap[fieldName] = fieldValue
}
...
}
在我看来,在这种情况下应该有一种避免类型切换的方法-我正在尝试做的是建立一个字段/值映射,其值不同于默认的零值,例如:
// doesn't work -- i.e., if fieldValue of type string would be compared against "", etc.
if fieldValue != reflect.Zero(reflect.Type(fieldValue)) {
qsMap[fieldName] = fieldValue
}
是否有一种优雅的方式来实现这一目标?
谢谢!
对于支持相等操作的类型,您可以只比较interface{}
包含零值和字段值的变量。像这样:
v.Interface() == reflect.Zero(v.Type()).Interface()
但是对于函数,地图和切片,此比较将失败,因此我们仍然需要包括一些特殊的大小写。此外,尽管数组和结构是可比较的,但如果它们包含不可比较的类型,则比较将失败。因此,您可能需要类似以下内容:
func isZero(v reflect.Value) bool {
switch v.Kind() {
case reflect.Func, reflect.Map, reflect.Slice:
return v.IsNil()
case reflect.Array:
z := true
for i := 0; i < v.Len(); i++ {
z = z && isZero(v.Index(i))
}
return z
case reflect.Struct:
z := true
for i := 0; i < v.NumField(); i++ {
z = z && isZero(v.Field(i))
}
return z
}
// Compare other types directly:
z := reflect.Zero(v.Type())
return v.Interface() == z.Interface()
}
如何获取字段的“真实”值? 我有一个框,我使用的是较新的HTML5输入类型: 这在Chrome29中得到了支持: (至少在Chrome 29中) 如何获取控件的“原始”值? 我试着浏览了Chrome的输入框的其他属性列表: null
问题内容: 我有一个泛型类。在一种方法中,我想获取类型T的类实例,但是我不能调用。 使用它解决问题的首选方法是什么? 问题答案: 简短的答案是,无法找到Java中泛型类型参数的运行时类型。我建议阅读Java教程中有关类型擦除的章节以获取更多详细信息。 一个流行的解决方案是将type参数的传递给泛型类型的构造函数,例如
知道如何根据Jackson的ObjectMapper对象和特定的Class检索给定json路径的Java类型吗? 假设我们有 Jackson的ObjectMapper我想找到一种方法,将字符串值反序列化到给定路径上由字段表示的类型的对象(或至少获取其类型),例如。 给定“/accountOwner/age”和“25”得到25(整数类型) 给定“/accountOwner/active”和“true
我正在创建一个程序,将确定和打印数字奇数,偶数和零在一个整数从键盘。我尝试了几种不同的方法,每种方法都得到了相同的结果。我无法让java将0识别为0,而只能识别为偶数。例1005将给出2赔率和2平。
如果我试图得到 我得到错误的错误只允许类的左边的类文字。我已经搜索,仍然没有找到如何获得泛型类的类型在Kotlin。
问题内容: 我有一个泛型类。在一种方法中,我想获取的类实例,但我无法调用。 使用它解决问题的首选方法是什么? 问题答案: 简短的答案是,无法找到Java中泛型类型参数的运行时类型。我建议阅读Java教程中有关类型擦除的章节以获取更多详细信息。 一个流行的解决方案是Class将type参数的传递给泛型类型的构造函数,例如