美文网首页工作生活
golang 面向接口编程的知识点讲解

golang 面向接口编程的知识点讲解

作者: 清晨的麦田 | 来源:发表于2019-07-01 17:56 被阅读0次

    初步介绍
    相同点:如果之前使用过java语种的话,简单的讲定义一个接口,类去实现这个接口的所有方法即可。

    不同点:
    在golang中会区分值类型和指针类型

    具体的让我们看下代码吧

    第一个列子:

    receiver 是值类型,接口赋值的也是值类型

    package main
    
    import "fmt"
    
    type Ball struct {
        val int
    }
    
    type Bar interface {
        setVal(newVal int)
        getVal() int
    }
    
    func (b Ball) getVal() int {
        return b.val
    }
    func (b Ball) setVal(newVal int) {
        b.val = newVal
    }
    
    func main() {
        var bar Bar
        bar = Ball{1000}//这里可以看到值类型的Ball实现了bar的所有接口,不会报错
    
        fmt.Printf("%p\n", bar)
    
    }
    
    

    上述列子,讲的是方法中的receiver是值类型如func(b Ball),Ball就是值类型的,可以看到main方法中,Ball是实现bar接口的

    第二个列子:

    receiver 是值类型,接口赋值的也是指针类型

    package main
    
    import "fmt"
    
    type Ball struct {
        val int
    }
    
    type Bar interface {
        setVal(newVal int)
        getVal() int
    }
    
    func (b Ball) getVal() int {
        return b.val
    }
    func (b Ball) setVal(newVal int) {
        b.val = newVal
    }
    
    func main() {
        var bar Bar
        bar = &Ball{1000} //这里换成了指针类型
    
        fmt.Printf("%p\n", bar)
    
    }
    
    

    上述列子,讲的是方法中的receiver是值类型如func(b Ball),Ball就是值类型的,可以看到main方法中,Ball的指针类型是实现bar接口的

    第三个列子:

    receiver 是值类型也有指针类型,接口赋值的也是指针类型

    package main
    
    import "fmt"
    
    type Ball struct {
        val int
    }
    
    type Bar interface {
        setVal(newVal int)
        getVal() int
    }
    
    func (b *Ball) getVal() int {
        return b.val
    }
    func (b Ball) setVal(newVal int) {
        b.val = newVal
    }
    
    func main() {
        var bar Bar
        bar = &Ball{1000} //这里赋值也没有问题,Ball的指针类型也是实现了Ball接口的
    
        fmt.Printf("%p\n", bar)
    
    }
    
    

    上述列子,讲的是方法中的receiver是值类型也有指针类型,可以看到main方法中,Ball的指针类型是实现bar接口的

    第四个列子:

    receiver 是值类型也有指针类型,接口赋值的是值类型

    package main
    
    import "fmt"
    
    type Ball struct {
        val int
    }
    
    type Bar interface {
        setVal(newVal int)
        getVal() int
    }
    
    func (b *Ball) getVal() int {
        return b.val
    }
    func (b Ball) setVal(newVal int) {
        b.val = newVal
    }
    
    func main() {
        var bar Bar
        bar = Ball{1000}//这里就错误了,会提示类型无法转换
    
        fmt.Printf("%p\n", bar)
    
    }
    
    

    上述列子,讲的是方法中的receiver是值类型也有指针类型,可以看到main方法中,Ball的值类型是没有实现bar接口的

    总结:
    1.如果接口转换时,右侧值如果是值类型,如果receiver是都是值类型的(receiver一定都是值类型的),那么都实现了接口可以赋值操作,转换也没有问题
    2.如果接口转换时,右侧值如果是指针类型,无论receiver是指针类型也好还是值类型也好,只要全部实现了接口方法,转换也没有问题

    那么我们可以这么理解,值类型的接口转换必须是值类型的receiver全部实现接口才以,指针类型的接口转换可以是值类型的也可以是指针receiver全部实现接口方法,转换也没有问题。

    指针类型的转换接口,包含范围更广一些,包含指针类型的receiver和值类型的receiver,只要全部实现接口即可以认为全部实现了接口

    值类型的转换接口,只能包含值类型的receiver,必须是值类型的receiver全部实现接口才可以认为实现了接口

    相关文章

      网友评论

        本文标题:golang 面向接口编程的知识点讲解

        本文链接:https://www.haomeiwen.com/subject/cjdncctx.html