java翻译go语言_golanginterface的使用和实现(翻译整理)-Go语言中文社区.pdfVIP

java翻译go语言_golanginterface的使用和实现(翻译整理)-Go语言中文社区.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

138****8628 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档