Thinking_Out_Loud

《Go程序设计语言》读书笔记#6

2018-10-07

第七章 接口

< P176 >

在操作interface时,编译器不会对T*T隐式转换,没有了简便的语法糖,因此T不拥有*T的方法;

< P182 >

  • interface由两部分组成,type存储type descriptorvalue一般存储指针;interface调用方法是间接调用,先根据type descriptor找到方法地址,再将value拷贝作为接收器传入;
  • interface可以两两比较或与nil比较;但是如果value中的类型是不可比较的,会发生panic只有typetype descriptor都为nil时,与nil的比较才为真(受人诟病的坑之一);
  • 调试时可以用%T打印type descriptorfmt通过反射获取;

< P188 >

Sort.Reverse的实现很巧妙,用结构体reverse又包装了interfacereverseLess方法调用匿名内嵌字段interfaceLess方法,而Reverse函数又返回满足sort.Interfacereverse结构体;

< 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 >

  • 类型断言分两种:
    1. x.(T),假如T是实际类型(concrete type)并且xinterface,断言检测通过返回xdynamic value,类型当然是T,检测失败引发panic
    2. 假如Tinterface,断言检测会检查xdynamic type是否满足T,返回结果满足T,一般结果的方法集更大,失败同样引起panic
  • 无论T是何种类型,对nil的断言永远失败;
  • 期望两个返回值的断言检测失败不会panic,额外返回值为布尔值表示是否成功,失败时第一个返回值为该类型零值;

< P212 >

type switch中,提取值之后的变量类型与当前case相同,除了多个条件并列时还是interface{};(另外企图用%T打印interface{}类型的我简直犯傻,本来打印方法的传参就是…interface{})