Go面向对象之接口

Posted louis181214

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go面向对象之接口相关的知识,希望对你有一定的参考价值。

一:接口的定义

interface类型可以定义一组方法,但这些方法不需要实现。且interface不能包含任何字段,某个自定义类型(如结构体),需要用到时再具体实现该方法。

技术分享图片

二:简单使用举例

package main

import (
	"fmt"
)

type itf interface{
	SayHello()
	Plud(num1 int, num2 int) int
}

type Personal struct{

}
func (p Personal) SayHello() {
	fmt.Println("hello world!")
}

func (p Personal) Plud(num1 int, num2 int) int{
	return num1 + num2
}

func main() {
	var p Personal
	p.SayHello()
	res := p.Plud(1, 2)
	fmt.Println(res)
}
结果
[ `go run interface.go` | done ]
	hello world!
	3

 三:接口使用细节

①:接口本身不可以创建示例,但可以指向一个实现该接口方法的自定义的类型(如结构体)

func main() {
	var p Personal
	var pp Itf = p
	pp.SayHello()
}

 ②:接口中的所有方法都没没有结构体;

③:一个自定义类型需要将接口的所有方法都实现,我们就会说该自定义类型实现了该接口;

④:一个自定义类型只有实现了某个接口,才能将该自定义类型的实例赋给接口(与③结合起来);

⑤:只要是自定义类型就可以实现接口,而不单单是结构体。

package main

import (
	"fmt"
)

type Itf interface{
	Say()
}

type inter int

func (i inter) Say() {
	fmt.Printf("这是数字%v",i)
}


func main() {
	var i inter = 1
	var ii Itf = i
	ii.Say()
}
结果
[ `go run interface.go` | done ]
	这是数字1

⑥:一个自定义类型可以实现多个接口

package main

import (
	"fmt"
)

type A interface{
	Say()
}

type B interface{
	Plud()
}
type C struct{

}

func (a C) Say() {
	fmt.Println("hello world!")
}

func (b C) Plud() {
	fmt.Println(1+1)
}

func main() {
	var c C
	var a A = c
	a.Say()
	var b B = c
	b.Plud()
}

结果
[ `go run interface.go` | done ]
	hello world!
	2

⑦:接口中不能有任何变量

⑧:接口也可以继承,只不过需要把所有继承的方法都要实现(包括本身的方法)

⑨:空接口interface{}可以接受任何数据类型.

func main() {
	var test interface{}
	test = 10
	fmt.Println(test)
	test = "louis"
	fmt.Println(test)
}
结果
[ `go run interface.go` | done ]
	10
	louis

⑩:interface默认为指针类型。

备注:如果要调用接口方法,则接口里的方法必须全部实现,无论该方法是否会被使用,否则报错。

以上是关于Go面向对象之接口的主要内容,如果未能解决你的问题,请参考以下文章

Go面向对象之接口

Go语言之面向对象-多态与类型断言

Java中面向对象的三大特性之封装

Go 面向对象

Golang如何体现面向对象三大特征之多态?

go语言面向对象编程(接口编程)