主要观点:有时需要用方法约束类型参数,但该方法应定义在指针类型上。例如用 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的方法。 - 简单写法在调用处需要更多代码,需单独声明变量,但避免了额外机制和约束名称。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。