Go语言中隐式接口的冲突问题
Go语言中隐式接口的冲突问题Go语言中采用的是隐式接口,只要满足的接口的定义,就可以当作接口使用. 比如内置的 type error struct { Error() string } 隐式接口的好处有很多. 但我个人觉得最主要的一点就是不需要再去画祖宗八代的继承关系图了(松耦合). 但是隐式接口会带来冲突问题. 简单来说,我也想定义一个自己的 type MyError struct { Error() string } 但是我希望 当然,在 Go语言中 我们一般可以在 type MyError struct { Error() string AssertMyError() } 方法 这是 Protobuf 中 proto.Message 采用的方法: // Message is implemented by generated protocol buffer messages. type Message interface { Reset() String() string ProtoMessage() } 生成的每个 当然,如果有另一个接口刚好也有 极端的做法是随机生成一个 特别的 方法名,比如用 UUID 做唯一名字. 但是,公开的名字依然有被别人恶意覆盖的危险(实际中不大可能). 更严格的做法是将这个用于区别接口的方法名定义为私有的方法. 比如 type TB interface { Error(args ...interface{}) Errorf(format string,args ...interface{}) Fail() FailNow() Failed() bool Fatal(args ...interface{}) Fatalf(format string,args ...interface{}) Log(args ...interface{}) Logf(format string,args ...interface{}) Skip(args ...interface{}) SkipNow() Skipf(format string,args ...interface{}) Skipped() bool // A private method to prevent users implementing the // interface and so future additions to it will not // violate Go 1 compatibility. private() }
因此 现在 我们可以从 package main import ( "fmt" "testing" ) type TB struct { testing.TB } func (p *TB) Fatal(args ...interface{}) { fmt.Println("TB.Fatal disabled!") } func main() { var tb testing.TB = new(TB) tb.Fatal("Hello,playground") } play 地址: http://play.golang.org/p/tFB0fLwq9q 上面的代码模拟了显式接口,而且 当然,上面的代码有过度使用技巧的问题,这和Go语言简单的编程哲学是矛盾的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |