首页  >  文章  >  后端开发  >  如何比较 Go 中的函数?

如何比较 Go 中的函数?

Linda Hamilton
Linda Hamilton原创
2024-11-01 06:25:30134浏览

How Can You Compare Functions in Go?

比较 Go 中的函数

在 Go 中,函数是一等值,这意味着它们可以分配给变量并作为参数传递给其他函数。然而,与 Go 中的其他类型不同,函数默认是不可比较的。当尝试比较代码中的函数时,这可能会导致混乱。

比较问题

正如 Go 语言规范中详细说明的,函数值是不可比较的。尝试使用标准比较运算符(例如 == 或 !=)比较函数值将导致编译器错误。

<code class="go">if handler.Post != Undefined {
  // ...
}</code>

未定义的未定义函数

代码示例中存在的未定义函数是一个函数的示例,其定义方式与常规函数不同。它被声明为一个函数,它接受单个字符串参数并且不返回任何内容(func Undefined(foo string))。然后将 Undefined 分配给 init 函数中 Handler 结构体的 Get 字段。此赋值为 Undefined 创建一个函数值,该值存储在 Get 字段中。

比较函数值地址

虽然函数本身无法比较,但可以比较函数值的地址。这可以通过使用 fmt.Sprintf 函数获取函数地址的字符串表示形式,然后比较结果字符串来实现。

<code class="go">p1 := fmt.Sprintf("%v", Undefined)
p2 := fmt.Sprintf("%v", hand.Get)
 fmt.Println("Expecting true:", p1 == p2)</code>

此方法有效地将函数值转换为字符串,然后可以将其使用==运算符进行比较。

替代方法:reflect.Value.Pointer()

比较函数值地址的另一种方法是使用reflect.Value.Pointer()方法。该方法返回反射值的内存地址,然后可以将其与另一个函数值的地址进行比较。

<code class="go">u1 := reflect.ValueOf(Undefined).Pointer()
u2 := reflect.ValueOf(hand.Get).Pointer()
fmt.Println("Expecting true:", u1 == u2)</code>

为了清晰而重构

一般不建议比较函数值地址。相反,重构代码以消除此类比较的需要是一种更有效且可维护的方法。考虑使用不同的方法,例如定义接口或使用类型断言,来实现您想要的行为。

以上是如何比较 Go 中的函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn