限制 Go 类型参数指针

主要观点:有时需要用方法约束类型参数,但该方法应定义在指针类型上。例如用 JSON 解析字节并传递结果给处理函数,原代码会出错,因为Message未实现json.Unmarshal,只有*Message实现,调用Handle[Message]会报错,调用Handle[*Message]会 panic。
关键信息:

  • 给出正确写法,通过定义Unmarshaler接口和Handle函数,在Handle函数中用PM(&m).UnmarshalJSON(b)来处理指针类型的参数。
  • 提到应避免这种模式,因为它增加了代码复杂度,举例说明更简单的写法,在UnmarshalAndLog函数中直接使用m.UnmarshalJSON(b)
    重要细节:
  • Handle函数中var m M创建了一个*Message并初始化为nil,导致调用UnmarshalJSON时出现问题。
  • 新写法中PM(&m)是为了让编译器能推断出可以在M的指针上调用PM的方法。
  • 简单写法在调用处需要更多代码,需单独声明变量,但避免了额外机制和约束名称。
阅读 8
0 条评论