• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go与接口:接口即约定

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

接口类型是对其他类型行为的概括与抽象。我们可以通过接口来约定某一类通用行为。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()
}

思考

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
使用vendor管理go第三方包发布时间:2022-07-10
下一篇:
go在并发情况下使用map发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap