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

栏目: Go · 发布时间: 5年前

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

初步介绍

相同点:如果之前使用过 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全部实现接口才可以认为实现了接口


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Django企业开发实战

Django企业开发实战

胡阳 / 人民邮电出版社 / 2019-2 / 99.00元

本书以博客系统贯穿始末,介绍了Django的方方面面。书中共分四部分,第一部分介绍了正式进入编码之前的准备工作,内容包括需求分析、基础知识和Demo系统的开发;第二部分开始实现需求,内容涉及环境配置、编码规范以及项目结构规划,编写了Model层、admin页面、Form代码和View逻辑,引入了Bootstrap框架;第三部分重点介绍xadmin、django-autocomple-light和d......一起来看看 《Django企业开发实战》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具