- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
java翻译go语⾔_golanginterface的使⽤和实现(翻译整理)-
Go语⾔中⽂社区
⼀、使⽤
Go的interface可以让你使⽤像Python⼀样纯动态语⾔的duck typing,但是仍然可以在编译时检测到类型错误,
例如传递⼀个int参数到⼀个对象的Read⽅法,该⽅法期待int参数,或者使⽤错误的参数个数调⽤Read⽅法。
为了使⽤interface,⾸先定义⼀个interface类型。(⽐如,ReadCloser):
type ReadCloser interface {
Read(b []byte) (n int, err os.Error)
Close()
}
然后定义⼀个新的函数,参数带有ReadCloser。
例如,这个函数重复调⽤Read⽅法去获取所有请求的数据,然后调⽤Close:
func ReadAndCloser (r ReadCloser, buf []byte) (n int, err os.Error) {
for len(buf) 0 err == nil {
var nr int
nr, err = r.Read(buf)
n += nr
buf = buf[nr:]
}
r.Close()
return
}
调⽤ReadAndClose的代码可以传递任何实现了正确函数签名的Read和Close⽅法 的类型。
并且,不像Python,如果你传递了错误的类型,可以在编译时检测到,⽽不是运⾏时。
interface不限于静态检查。可以动态的检查特定接⼝值是否具有其他⽅法。例如:
type Stringer interface {
String() string
}
func ToString(any interface{}) string {
if v, ok := any.(Stringer); ok {
return v.String()
}
switch v := any.(type) {
case int:
return strconv.Itoa(v)
case float:
return strconv.Ftoa(v, g, -1)
}
return
}
any值有个静态的类型interface{},意味着不保证有任何⽅法:可以包含任何类型。
在if语句中的 v, ok = any.(Stringer); 赋值语句询问是否可以将any变量转换为Stringer类型(有String⽅法)。
(这⾥any查看any.tab-type 是否 是Stringer 类型,如果是,返回any.data)
如果是,该语句的正⽂将调⽤该⽅法来获取要返回的字符串。
否则,在放弃前,使⽤switch语句检查是否是其他类型可以转换为字符串来返回。
这基本上是fmt package的简单版本。
(if语句可以在switch中增加case Stringer来代替:在switch body的第⼀个case,但是我使⽤了⼀个单独的声明来强调)
作为⼀个简单的例⼦,考虑⼀个64位的integer类型,使⽤String和Get⽅法打印⼆进制值:
type Binary uint64
func (i Binary) String() string {
return strconv.Uitob64(i.Get(), 2)
}
func (i Binary) Get() uint64 {
return uint64(i)
}
Binary类型的值可以传递给ToString,ToString将会使⽤String⽅法格式化,即使程序从未说明Binary将会实现Stringer。
没必要那样做,因为:运⾏时可以看到Binary有String⽅法,因此它实现了Stringer,即使Binary的作者从未听说过Stringer。
这些例⼦展⽰了,即使在编译时检查了所有的隐式转换,显⽰的interface-to-interface转换也可以在运⾏时查询⽅法集。
⼆、interface的value值
有method的语⾔通常在两个阵营之⼀:为所有method调⽤准备⼀个table(C++和Java),或为每个method调⽤执⾏method lookup(包
括Smalltalk和它的拥趸,JavaScript和Python)并且使⽤缓存来使调⽤更有效率。Go是两种⽅式的折中:它有method table,但是在运⾏
时计算。不知道是否Go语⾔是第⼀个使⽤这个技术的语⾔,但肯定不常见。
作为热
文档评论(0)