Go 在使用泛型时无法与 Pointer Receiver 共存的解决方法

Go 在使用泛型时无法与 Pointer Receiver 共存的解决方法

💡 原文中文,约2600字,阅读约需7分钟。
📝

内容提要

在使用Go的泛型时,如果泛型类型存在constraint,而传入的类型在实现这个constraint时使用的是pointer receiver,就会遇到报错。解决方案是将实现interface的传入改为value receiver或者在调用函数时加上*。另一种解决方案是定义一个指针interface,通过这个interface来实现泛型与pointer receiver的共存。

🎯

关键要点

  • 在使用 Go 的泛型时,存在 constraint 的情况下,使用 pointer receiver 会导致编译错误。
  • 错误信息提示 Student 不满足 Person,因为 SetID 方法是用 pointer receiver 实现的。
  • 解决方案之一是将实现 interface 的传入改为 value receiver,但这会导致 SetID 不作用于原变量。
  • 另一种解决方案是调用函数时加上 *,如 Create[*Student](1),但会导致运行时错误。
  • 由于 Go 的限制,不能直接将 T 转为指针并调用 interface 的方法。
  • 可以定义一个指针 interface,允许传入任意类型 T,并确保实现了 Person interface。
  • 最终的函数定义需要同时包含 T 和 Ptr 的泛型,调用时需要指定具体类型。
  • 总结:使用 Go 的泛型时需谨慎,避免复杂的类型限制和指针问题。
➡️

继续阅读