可见interface是go中很重要的一个特性。
在网上有人问:Go语言中接口到底有啥好处,能否举例说明?于是,我考虑以io.Writer接口为例谈谈interface{}
在go标准库io包中定义了Writer接口:
<span id="3_nwp" style="width: auto; height: auto; float: none;"><a id="3_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=6f7397cade0a19af&k=type&k0=type&kdi0=0&luki=3&mcpm=0&n=10&p=baidu&q=74042097_cpr&rb=0&rs=1&seller_id=1&sid=af190adeca97736f&ssp2=1&stid=9&t=tpclicked3_hc&td=1989498&tu=u1989498&u=http%3A%2F%2Fblog%2Estudygolang%2Ecom%2F2013%2F02%2F%25E4%25BB%25A5io%2Dwriter%25E4%25B8%25BA%25E4%25BE%258B%25E7%259C%258Bgo%25E4%25B8%25AD%25E7%259A%2584interface%2F&urlid=0" target="_blank" mpid="3" style="text-decoration: none;"><span style="color:#0000ff;font-size:13.92px;width:auto;height:auto;float:none;">type</span></a></span> Writer interface {
Write(p []byte) (n int, err error)
}
根据go中接口的特点,所有实现了Write方法的类型,我们都说它实现了io.Writer接口。
二、io.Writer的应用
通常,我们在使用fmt包的时候是使用Println/Printf/Print方法。其实,在fmt包中还有Fprint序列方法,而且,Print序列方法内部调用的是Fprint序列方法。以Fprintln为例看看方法的定义:
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
方法的第一个参数是io.Writer,也就是说,任何实现了io.Writer接口的类型实例都可以传递进来;我们再看看Println方法内部实现:
func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
}
我们不妨追溯一下os.Stdout:
Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
也就是标准输出。 从这里可以看出,os.File也实现了io.Writer,那么,如果第一个参数传递的是一个普通文件,内容便会被输出到该文件。 如果第一个参数传递的是bytes.Buffer,那么,内容便输出到了buffer中。
在写Web程序时,比如:
func Index(rw http.ResponseWriter, req *http.Request) {
fmt.Fprintln(rw, "Hello, World")
}
这样便把”Hello World”输出给了客户端。
三、关于接口更多学习资料
1、Rob Pike谈Go中的接口