当前位置: 首页 > 面试题库 >

通过Go中的反射检测空值的快速方法

秦博达
2023-03-14
问题内容

我有一个int/ string/ bool/ etc ..值存储在中,interface{}并且想要确定它是否未初始化,这意味着它的值是

  • 0
  • ""
  • false
  • 要么 nil

我该如何检查?


问题答案:

据我了解,您想要的是:

func IsZeroOfUnderlyingType(x interface{}) bool {
    return x == reflect.Zero(reflect.TypeOf(x)).Interface()
}

在谈论接口和时nil,人们总是对两个截然不同且无关的事物感到困惑:

  1. nil接口值,其是不具有一个接口值 的基础值 。这是接口类型的零值。
  2. nil接口值(即,它具有 基础值 ),但是其基础值是其基础类型的零值。例如,基础值是nil映射,nil指针或0数字等。

据我了解,您正在询问第二件事。

更新 :由于上面的代码的使用==,它对于不可 比较的
类型无效。我相信,使用reflect.DeepEqual()代替将使它适用于所有类型:

func IsZeroOfUnderlyingType(x interface{}) bool {
    return reflect.DeepEqual(x, reflect.Zero(reflect.TypeOf(x)).Interface())
}


 类似资料:
  • 问题内容: 我有一个带有成员A,B,C字符串的struct v。使用反射,我可以获取字段名称及其值: 因为我有名称,并且可以获取值OUT,所以可以为这些字段分配新值吗?我想做的基本上是: 但这显然行不通。如果仅知道字段名称,是否可以将值分配给结构? 在实践中,我试图将来自a的值分配给结构中的相应字段,其中结构和映射定义可能会随着时间的变化而扩展,并且映射可能包含比该结构更多或更少的值。我已经考虑过

  • 问题内容: 考虑以下代码: 我对标有的参数的值感兴趣。假设我已经通过反射(使用)弄清楚了哪个方法参数具有注释。(我知道这是参数列表中的第三个参数。) 现在如何检索值以进一步使用? 问题答案: 你不能 反射无法访问局部变量,包括方法参数。 如果您需要该功能,则需要拦截方法调用,可以通过以下几种方法之一进行操作: AOP(AspectJ / Spring AOP等) 代理(JDK,CGLib等) 在所

  • 问题内容: 我必须为具有相似签名和返回值(一个对象和一个错误)的多个函数编写单元测试,这些函数必须通过相似的测试条件。 我想避免写: (见本去操场例子更完整的上下文) (是的,去游乐场还不支持,只有和问题6511是有没有要求该功能) 为了只编写一个测试,您将 如何使用反射(包): 依次调用每个函数? 测试他们的返回值? 但是我想念一个完整的示例来调用函数并在测试中使用返回的值。 问题答案: 一旦我

  • 主要内容:判定及获取元素的相关方法,值修改相关方法,值可修改条件之一:可被寻址,值可修改条件之一:被导出Go语言中类似 x、x.f[1] 和 *p 形式的表达式都可以表示变量,但是其它如 x + 1 和 f(2) 则不是变量。一个变量就是一个可寻址的内存空间,里面存储了一个值,并且存储的值可以通过内存地址来更新。 对于 reflect.Values 也有类似的区别。有一些 reflect.Values 是可取地址的;其它一些则不可以。考虑以下的声明语句: x := 2 // value type

  • 问题内容: 我有一个这样声明的枚举: 现在,我想通过反射找出该枚举的键(SystemRunning,SystemStopped,tmpIdle): 输出为:RUNNING STOPPED IDLE 但是,我想使用Strings SystemRunning,tmpIdle等。 提前非常感谢您。 问题答案: 首先,您需要使您的非静态变量。 然后,您需要在枚举中添加getter方法,该方法将返回 然后将

  • 本文向大家介绍go语言通过反射获取和设置结构体字段值的方法,包括了go语言通过反射获取和设置结构体字段值的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言通过反射获取和设置结构体字段值的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的go语言程序设计有所帮助。