第七章 接口
< P176 >
在操作interface时,编译器不会对T和*T隐式转换,没有了简便的语法糖,因此T不拥有*T的方法;
< P182 >
interface由两部分组成,type存储type descriptor,value一般存储指针;interface调用方法是间接调用,先根据type descriptor找到方法地址,再将value拷贝作为接收器传入;interface可以两两比较或与nil比较;但是如果value中的类型是不可比较的,会发生panic;只有type与type descriptor都为nil时,与nil的比较才为真(受人诟病的坑之一);- 调试时可以用
%T打印type descriptor,fmt通过反射获取;
< P188 >
Sort.Reverse的实现很巧妙,用结构体reverse又包装了interface,reverse的Less方法调用匿名内嵌字段interface的Less方法,而Reverse函数又返回满足sort.Interface的reverse结构体;
< P191-195 >
http.Handler是基本的interface,只要求ServerHTTP方法,作为ListenAndServe的第二个参数;- 为了分离逻辑,
net/http包提供了ServeMux,将多个http.Handler集合为一个;在传入方法时用http.HandlerFunc将方法转为http.Handler,注意http.HandlerFunc是一种函数类型,作为ServerHTTP接收器,满足http.Handler接口,并在内部调用自己; net/http提供了默认的ServeMux,即DefaultServeMux,在ListenAndServe第二参数传入nil即可,用http.HandeFunc添加路由;- 注意每个请求都会单独创建一个
goroutine;
< P196 >
errors.New返回errorString结构体的指针,所以两个New出来的error比较是不相等的;
< P205 >
- 类型断言分两种:
x.(T),假如T是实际类型(concrete type)并且x为interface,断言检测通过返回x的dynamic value,类型当然是T,检测失败引发panic;- 假如
T是interface,断言检测会检查x的dynamic type是否满足T,返回结果满足T,一般结果的方法集更大,失败同样引起panic;
- 无论
T是何种类型,对nil的断言永远失败; - 期望两个返回值的断言检测失败不会
panic,额外返回值为布尔值表示是否成功,失败时第一个返回值为该类型零值;
< P212 >
在type switch中,提取值之后的变量类型与当前case相同,除了多个条件并列时还是interface{};(另外企图用%T打印interface{}类型的我简直犯傻,本来打印方法的传参就是…interface{})