美文网首页工作生活
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 面向接口编程的知识点讲解

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

  • Golang面向对象编程之继承&虚基类【组合&接

    [TOC] Golang面向对象编程之继承&虚基类【组合&接口】 201808 相关说明 Golang里面没有像C...

  • 《Oracle Java SE编程指南》15-05:面向接口编程

    内容导航: 前言 1、接口的作用 2、面向接口编程 前言 接口的核心作用是面向接口编程。 面向接口编程 是一个非常...

  • Android 面向接口编程

    关键词:Android、POP、面向接口编程 、面向过程、面向协议 一、概述 面向接口编程是面向对象编程的一种实...

  • Android 网络框架--Retrofit2 架构分析

    面向接口编程 面向接口编程,模块化编程的必备技能,其乃实现解耦,增强扩展性的重要手段。 面向接口编程具体指的是什么...

  • golang 面向对象特性

    和其他高级语言一样,golang 也支持面向对象编程,支持得比较简单,有些特性并不支持,但是够用了 接口 接口使用...

  • golang面向对象特性

    和其他高级语言一样,golang 也支持面向对象编程,支持得比较简单,有些特性并不支持,但是够用了 接口接口使用 ...

  • 8、使用注解开发

    8.1:面向接口编程 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程 ...

  • 面向指针编程(一)

    面向对象编程,面向设计模式编程(亦即设计模式),面向接口编程,面向模板编程(亦即泛型编程),面向函数编程(亦即函数...

  • Golang 学习笔记(05)—— 面向对象编程

    本文为转载,原文:Golang 学习笔记(05)—— 面向对象编程 前言 golang是面向过程的语言,go中没有...

网友评论

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

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