go interface的一点心得

whispermemory · · 5279 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

先看golanger.com关于interface的说明 *Interfaces in Go provide a way to specify the behavior of an object: if something can do this, then it can be used here* 翻译下来就是: interfaces 用来指定一个object的的行为,如果该object能够执行该行为,这个接口就可以替代这个对象。 文档中举了一个例子: fmt包中的Fprintf方法 `func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)` 第一个参数是 io.Writer 看io.Writer的定义 type Writer interface { Write(p []byte) (n int, err error) } 就是说只要实现了Write方法的struct 都可以作为第一个参数传递给Fprintf。为了验证这个,我写了一段代码 package main import ( "fmt" ) type S struct { b []byte } func (this *S) Write(p []byte) (n int, err error) { this.b = p return 0, nil } func main() { s := new(S) fmt.Fprintf(s, "abc") } 果然如此这时候调用fmt.Fprintf方法就会吧"abc"输出到s中。 来查询下实现了该io.writer接口的对象有哪些: bytes包里面的Buffer对象 func (b *Buffer) Write(p []byte) (n int, err error) { b.lastRead = opInvalid m := b.grow(len(p)) return copy(b.buf[m:], p), nil } 这里可以推测下对与byte类型数据,封装的其实是一个Buffer*,当调用fmt.Printf方法写近byte对象时候,会让Buffer实际上对需要写进去的数据进行操作。调用的b.grow方法可见该Buffer是动态分配的大小的。 下面是http包中对于response结构的Write方法实现 func (w *response) Write(data []byte) (n int, err error) { if w.conn.hijacked() { log.Print("http: response.Write on hijacked connection") return 0, ErrHijacked } if !w.wroteHeader { w.WriteHeader(StatusOK) } if len(data) == 0 { return 0, nil } if !w.bodyAllowed() { return 0, ErrBodyNotAllowed } w.written += int64(len(data)) // ignoring errors, for errorKludge if w.contentLength != -1 && w.written > w.contentLength { return 0, ErrContentLength } return w.w.Write(data) } 这两个例子能够表现出来接口的适应能力,它可以代表实现某一个方法的所有结构。它可以作为一个形参来接受所有实现该接口的实参。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5279 次点击  
加入收藏 微博
4 回复  |  直到 2013-04-13 05:05:04
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传