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全部实现接口才可以认为实现了接口


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

查看所有标签

猜你喜欢:

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

Nine Algorithms That Changed the Future

Nine Algorithms That Changed the Future

John MacCormick / Princeton University Press / 2011-12-27 / GBP 19.95

Every day, we use our computers to perform remarkable feats. A simple web search picks out a handful of relevant needles from the world's biggest haystack: the billions of pages on the World Wide Web.......一起来看看 《Nine Algorithms That Changed the Future》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具