• 【笔记】go语言接口


    【笔记】go语言--接口

    接口的概念

    • 强类型语言:熟悉接口的概念
    • 弱类型语言:没(少)有接口的概念
    • 接口的详解︰使用Google Guice实现依赖注入
    curl 是获取http请求的命令工具
    curl一个地址可以将首页的源码(html文件)给拉下来
    例如:http.get("http://www.imooc.com")
    
    //接口的本质
    type Traversal interface {
    		Traverse()
    }
    
    func main() {
    	traversal := getTraversal()
    	traversal.Traverse()
    }
    

    duck typing的概念

    duck typing

    • “像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子”
    • 描述事物的外部行为而非内部结构
    • 严格说go属于结构化类型系统,类似duck typing

    go语言的duck typing

    • 同时需要Readable,Appendable怎么办?( apache polygene)
    • 同时具有python , c++的duck typing的灵活性
    • 又具有java的类型检查
    //java中的类似代码,传入的参数必须实现Retriever接口,不是duck typing
    <R extends Retriever>
    String download(R r) {
    	return r.get("www.imooc.com");
    }
    
    
    //C++中的duck typing,编译时才知道传入的retriever有没有get,需要注释来说明接口
    template <class R>
    string download(const R& retriever) {
    	return retriever.get("www.imooc.com");
    }
    
    
    //python中的duck typing,运行时才知道传入的retriever有没有get,需要注释来说明接口
    def download(retriever):
    	return retriever.get("www.imooc.com")
    

    接口的定义和实现

    • 在go当中接口由使用者定义,通常由使用方写在使用方的代码里
    • 接口的实现是隐式的,不需要声明实现了哪个接口,只需要实现接口里的方法就可以了

    简单来说,接口由使用者定义且接口的实现是隐式的,实现接口里面的方法即可

    注意的是:

    • interface 里不用加func关键字,因为里面都是函数
    • 实现接口的快捷键 crtl+shift+i

    接口的值类型

    1、接口内部包含俩个东西,分别是类型T和值V,值可以是真是的值,也可以是个指针。
    2、接口变量自带指针
    3、接口变量同样采用值传递,几乎不需要使用接口指针
    4、指针接收者实现只能以指针方式使用;值接收者就都可以
    5、var r Retriver (Retriver是接口)
    r = mock.Retriever{}(值接收)
    r = &mock.Retriever{}
    r = &real.Retriever{}(接收者为指针)
    6、type assertion
    

    查看接口变量

    • 表示任何类型:interfacel
    • Type Assertion
    • Type Switch

    interface的实现类型的检查方式

    (1) 类型转换
    //参数r的类型是interface,通过.(type)转换成他的实现类型的变量v,
    //然后根据v的实际类型,打印出v的值
    func inspect(r Retriever) {
    		fmt.Printf("%T %v\n", r, r)
    	switch v := r.(type) {
    		case mock.Retriever:
    		fmt.Println("Contents: ", v.Contents)
    		case real.Retriever:
    		fmt.Println(v)
    	}
    }
    
    (2) 类型断言 也是 类型转换
    - v = x.(T)
    - v, ok = x.(T)
    x是接口变量,T是指定转换的类型
    ok表示转换是否成功,v是对应类型的值
    var r Retriever
    r = real.Retriever{}
    fmt.Printf("%T %v\n", r, r)
    mr := r.(mock.Retriever)
    fmt.Println(mr.Contents)
    (panic: interface conversion: main.Retriever is real.Retriever, not mock.Retriever)
    

    常用的系统接口:

    • stringer 类似于其他语言的toString
    • Reader
    • Writer
    //详细
    1.fmt.Stringer interface
    - String() string
    
    2.io.Reader interface
    - Read(p []byte) (n int, err error)
    把字节读入参数p,长度不能超多byte数组的长度,返回实际长度n
    Ex) string.NewReader(string) *Reader
    
    3.io.Writer interface
    - Write(p []byte) (n int, err error)
    把字节数组p的内容写到底层的数据流里面,返回内容的长度
    
  • 相关阅读:
    javascript 实现页面跳转,禁止返回上一页【转】
    mysql 根据多个不同字段进行分组,并统计总数,求和
    阻止移动端浏览器点击图片浏览行为的几种方法【转】
    iframe子父窗口相互操作方法或元素
    jquery 之ajax,get,post异步请求简单代码模版
    select默认选择后台转过来的option选项
    Font Awesome 最简单应用例子
    清空select标签中option选项的3种不同方式
    js将字符串转换成json的三种方式
    Js获取当前日期时间
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/15876390.html
Copyright © 2020-2023  润新知