主要观点:有时需要用方法约束类型参数,但该方法应定义在指针类型上。例如用 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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。