重要

函数也可作为接受者

image.png

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

接口

image.png

接口的实现是隐式的,只需要实现接口的方法即可

将实现类赋值给接口变量,那么底层存储的是,变量的具体类型和具体值,如果接受者是一个指针,那么变量的底层则是指针

  1. type Retriever interface {
  2. Get (url string) string
  3. }
  4. func main(){
  5. var r Retriever
  6. r=mock.Retriever{"this is a fake imooc.com"}
  7. fmt.Printf("%T %V\n",r,r)
  8. r=&real.Retriever{
  9. UserAgent:"Mozilla/5.0",
  10. TimeOut:time.Minute,
  11. }
  12. fmt.Printf("%T %V\n",r,r)
  13. //fmt.Println(download(r))
  14. }
  15. //不同的包
  16. type Retriever struct {
  17. Contents string
  18. }
  19. func (r Retriever) Get(url string) string{
  20. return r.Contents
  21. }
  22. //不同的包
  23. type Retriever struct {
  24. UserAgent string
  25. TimeOut time.Duration
  26. }
  27. func (r *Retriever) Get(url string) string {
  28. return r.UserAgent
  29. }

结果如下:
image.png