重要
函数也可作为接受者

定义了一个类型是一个func,实现了io.Read接口,在方法名前面加上接受者实际就是go的一个语法,作为一个特殊的参数,可以理解为java中的this,如果不写,将函数作为参数传入也是一样的,只是调用方式的变化,g.read()—->read(g)
接口

接口的实现是隐式的,只需要实现接口的方法即可
将实现类赋值给接口变量,那么底层存储的是,变量的具体类型和具体值,如果接受者是一个指针,那么变量的底层则是指针
type Retriever interface {Get (url string) string}func main(){var r Retrieverr=mock.Retriever{"this is a fake imooc.com"}fmt.Printf("%T %V\n",r,r)r=&real.Retriever{UserAgent:"Mozilla/5.0",TimeOut:time.Minute,}fmt.Printf("%T %V\n",r,r)//fmt.Println(download(r))}//不同的包type Retriever struct {Contents string}func (r Retriever) Get(url string) string{return r.Contents}//不同的包type Retriever struct {UserAgent stringTimeOut time.Duration}func (r *Retriever) Get(url string) string {return r.UserAgent}
结果如下:
