以前接触过的一个 Java 项目,实现了一种在我看来很新的做法:
public class Echo extend Msg {
String msg;
public void decode(){}
public void encode(){}
public void process() throws Exception {
throw new UnsupportedOperationException();
}
}
@MsgProcess
public static boolean process(Echo echo) {
return true;
}
@MsgProcess
的 Metchod 和他的参数,然后用 javaassist 的字节码操作,将协议类Echo
的process
方法给替换掉!这样框架层调用协议的msg.process()
就可以直接执行业务逻辑!Java 写了 10 年,一说起框架,自然想到的就是各种设计模式抽象继承与反射之类,当写 Go 的时候,也受到影响,我现在想用 Go 实现类似的操作,实践的效果如下
package proto
type Echo struct {
BaseMsg
Msg string
}
func (msg *Echo) Decode(src *bytes.Buffer) error {}
func (msg *Echo) Encode(dst *bytes.Buffer) error {}
func (msg *Echo) Process() {
panic("implement me")
}
package logic
import proto
func ProcessEcho(msg *proto.Echo) {}
Echo
的process
的方法体替换为ProcessEcho
func (msg *Echo) Process() {
logic.ProcessEcho(msg)
}
但重新生成的 Echo 类,有一些问题,首先生成出来的文件,我将其保存为echo_override.go
放在另一个 package ,相关的 import 都可能有问题,然后Process
import 了 logic ,而 logic 自然要 import echo ,非常经典的 import cycle 。
这是第一步遇到的问题,我打算先用 interface 解决看看,为什么不用 func 替换,我觉得好丑啊!各位 Go 大神有没有什么建议?我这种思路,符合 Go 的设计哲学吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.