第七章 接口

flag包,io包 fmt包
接口类型是对其他类型行为的抽象和概括,因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象方式,我们可以让我们的函数更加灵活和更具有适应能力。
go语言的接口类型的特点在于,它的实现方式是隐式的,也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单地拥有一些必须的方法就足够了。这种涉及可以让你创建一个新的接口类型满足已经存在的具体类型,却不会改变这个类型的定义;


基础理解:接口类型是一种抽象的类型。它不会暴露出它所代表的对象的内部值的结构和这个对象支持的基础操作的集合;它只会展示出它们自己的方法。也就是说当你有看到一个接口类型的值时,你不知道它是什么,唯一知道的就是可以通过它来做什么。
一个类型可以自由的使用另一个满足相同接口的类型来进行替换被称作可替换性,(LSP里式替换)这是一个面向对象的特征。

接口类型
接口类型具体描述了一系列方法的集合,一个实现了这些方法的具体类型是这个接口类型的示例。
io.Writer类型是用的最广泛的接口之一,因为它提供了所有的类型写入bytes的抽象。接口的实现允许接口内嵌例如:

//基础声明
type Read interface{
  Read(p []byte)(n int,err error)
}
type Closer interface{
  Close() error
}
//内嵌声明:
type ReadWriter interface{
  Reader
  Writer
}
//混合声明:
type ReadWriter interface{
  Read(p []byte)(n int,err error)
  Writer
}

实现接口的条件

一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。例如,*os.File 类型实现了io.Reader ,Witer ,Closer,和ReaderWiter接口等。
几个特殊的接口
空接口 interface{}没有任何实现方法,所以可以说任何变量都实现了空接口。之后的类型断言用于判断变量类型的时候,这个点就应用的很广泛。
flag.value接口这个几口帮助命令行标记定义新的符号。
它的构成

package flag
type Value interface{
  String() string 
  Set(string) error
}

sort.Interface接口
排序操作和字符串格式化一样是很多程序经常使用的操作。尽管一个最短的快排只要15行就可以搞定,但是一个健壮的实现,需要更多的代码,并且我们不希望每次都去拷贝这种方法。
sort包内置的提供了根据一些排序函数来对任何序列排序的功能。go中提供了sotr.Sort函数,它不会对任何具体的序列和它的元素做假设,相反它使用了一个接口类型sort.Interface来指定通用的排序算法和可能被排序到序列类型的约定。这个接口的实现由序列的具体表示和它希望排序的元素决定。序列的表示通常是一个切片。
sort.Interface的本体方法为:

package sort
type Interface interface{
  Len() int// 长度
  Less(i,j int) bool //对比函数,确定两者谁大
  Swap(i,j int)   //排序,按照升序降序 ,对换ij下标中的值。
}

对于字符串切片的排序经常用到,所以sort包提供了StringSlice类型,也提供了Strings函数能让调排序简化为:sort.Strings(names)
sort包中提供Reverse函数将排序顺序从接口定义的less函数转换成逆序。
reverse的本体如下:

type reverse struct {Interface}
func (r reverse) Less(i,j int) bool {return r.Interface.Less(j,i)}
func Reverse(data Interface) Interface { return reverse{data}}

它的len和swap函数隐式的由原有内嵌的s.Interface提供。
检查一个序列是否需要排序使用函数sort.IsSorted

http.Handler 接口

net/http包实现了网络客户端与服务器的操作,
基础服务:
ListenAndServe(address string, h Handler) error 会一直执行,知道这个服务运行因为一个错误而失败,它的返回值一定是一个非空的错误。
address 是一个类似 “localhost:8080”的服务器地址,Handler则是请求处理的函数。

Handler 接口需要实现一个ServerHttp(w ResponseWriter, r *Request) 方法
该方法实现接收http参数与处理。

Handler接收所有来自LisetenAndServe的处理,分路径处理的话就需要涉及到:r .URL.Path 变量。可以用该变量做路由分流所有的http请求。
至此基础的golang http服务流程就基本完事了
下面我们说说个更加简单的url配置方式serveMux^^
net/http包提供一个请求多路器serveMux 来简化URL和handlers的联系。

error接口
error类型是一个接口类型,这个类型有一个单一的返回错误信息的方法 Error 本体:

type error interface {
  Error() string
}
//error 包 只有四行
package errors 
func New(text string) errpr {return &errorString{text}}
type errorString struct{text string}
func (e *errorString) Error()string {return e.text}

errors.New 函数很少调用,因为有一个方便的封装函数fmt.Errorf,它会处理字符串格式化 除了基础的errorString 还有errno等表示错误数字小心的包。


接口值

概念上讲接口的值,接口值,由两部分组成,具体的类型和那个类型的值;合起来被称为接口值,分别被称为接口的动态类型和动态值。
在go中变量总是被一个定义明确的值初始化,即使接口类型也不例外。对于一个接口的零值就是它的类型和值的部分都是nil。这种零值接口允许w==nil进行判断,但是直接用零值接口调用任何方法,都会产生panic。
接口值是可以比较的,但是如果两个接口值的动态类型相同,但是这个类型是不可比较的类型(类似切片),它们比较就会失败产生panic。所以基于这点接口类型比较特殊,它时而能比较(普通变量)时而不能比较(接口值变化),所以在处理接口值比较的时候我们必须处理可能发生的panic,规避这种潜在的风险,避免因为类型转变导致的panic。

注意:一个包含nil指针的接口不是nil接口
一句话来说就是,一个不包含任何值的接口值和一个刚好包含nil指针的接口值是不同的。因为不包含任何值的接口值的动态类型是nil而包含nil指针的接口值的动态类型是指针。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,790评论 0 38
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,752评论 2 9
  • 八点半下晚课, 两小时地铁车程, 义无反顾, 脱下高跟鞋, 换下正装, 往前赴约。 冲动有时候需要很多理由, 冲动...
    放盐橙阅读 138评论 0 0
  • 【文】人间十一月 从未得过沧海,心中已满是桑田。 从未得过旭日,头顶却仍是星辰。 从未经过山巅,旅途也未曾平坦。 ...
    那个诗人阅读 151评论 0 0
  • 山间弥漫起青色的烟雾,不知是上坟人燃烧的纸片所致,还是坟里的魂魄施的障眼法,回来了人间。 一辆车停在离坟不远的地方...
    楼台花舍阅读 300评论 2 7