接口

接口类型是对其他类型行为的概括与抽象。我们可以通过接口来约定某一类通用行为。Go语言的接口是隐式的:只要实现接口A的所有方法就代表实现了接口A。

接口即约定

接口是什么样的?

package io

// Writer is the interface that wraps the basic Write method.
//
// Write writes len(p) bytes from p to the underlying data stream.
// It returns the number of bytes written from p (0 <= n <= len(p))
// and any error encountered that caused the write to stop early.
// Write must return a non-nil error if it returns n < len(p).
// Write must not modify the slice data, even temporarily.
//
// Implementations must not retain p.
type Writer interface {
Write(p []byte) (n int, err error)
}

这是标准库的一个接口,他定义了一个方法Write来约定我们如果想实现写接口需要怎么做。

书中举了fmt.Printffmt.Sprintf的例子,他们的相同点是实现了字符串的格式化,不同点是对格式化结果的行为,前者是发到标准输出,后者是以string类型返回。标准库肯定不会将相同的部分两边,它是这样做的:用第三个函数Fprintf来封装格式化,并且将对格式化后的结果的行为收拢成“将结果写到一个地方”(即定义接口Writer),至于这个地方是哪里的问题丢给了调用方(即通过接口来约定调用者必须传递一个实现接口Writer的类型),调用者可以把结果写到标准输出(即fmt.Printf),调用者也可以把结果写到某个buffer里(即fmt.Sprintf)。这样的解法便达到了复用且灵活。

package fmt
func Fprintf(w io.Writer, format string, args ...interface{}) (int, error) {
// 格式化
w.Write()
//...
} func Printf(fomrat string, args ...interface{}) (int, error) {
return Fprintf(os.Stdout, format, args...)
} func Sprintf(format string, args ...interface{}) string {
var buf bytes.Buffer
Fprintf(&buf, format, args...)
return buf.String()
}

思考

接口的写法与实现很简单,难的是接口的定义与接口的使用。接口的定义是对许多具象使用场景的抽象,接口的目的是什么?接口以后的适用场景是哪些?在实现接口的方法是要注意什么?这写都应该在接口定义的注释中写明。

最新文章

  1. swift初体验
  2. IOS 图片上传处理 图片压缩 图片处理
  3. top指令
  4. HDU 3397 Sequence operation (区间合并,操作比较多)
  5. 【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)
  6. UVA1218--树形DP
  7. Spring-webflow基础讲解
  8. [综述]Deep Compression/Acceleration深度压缩/加速/量化
  9. Could not load file or assembly &#39;System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&#39;
  10. 盒模型、position、float详解css重点汇总
  11. iOS 自定义一个常规的TabBar
  12. 面向对象【林老师版】:特性(property)(十六)
  13. oracle数据泵导入导出命令
  14. 为什么说Java中只有值传递?
  15. _DataStructure_C_Impl:图的邻接矩阵存储
  16. 全网最详细的跑python2.7时出现from mysql import connector ImportError: No module named mysql的问题解决办法(图文详解)
  17. SQLMAP学习笔记2 Mysql数据库注入
  18. Qt Creator下应用CMake项目调试mex文件
  19. 微信小程序 - 生命周期 - 参数传递
  20. Swift,初始化

热门文章

  1. 详述 IntelliJ IDEA 远程调试 Tomcat 的方法
  2. 网络损伤仪WANsim的带宽限制功能
  3. 解析ArrayList的底层实现(上)
  4. 如何在VeryCD中下载资源
  5. Fedora无法安装Qt4
  6. 利用PhotoShop CS6进行抠图
  7. Tom_No_01 IDEA tomcat 源码环境搭建
  8. artDialog 简单几种用法
  9. Window2016 安装Docker
  10. Build a Beautiful oh-my-zsh Themes