Golang接口interface理解

155 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


Golang如何实现接口

接口,interface,很多OO语言都会对接口设计的很好,不过其实这个概念不是只有OO才有的。接口实际上是一个抽象概念,任何语言,或者·模块,都可以用到接口的设计思想。

这里我们讨论的接口,主要是指的go语言中关键字interface的实现,这个关键字实现了一些接口的功能。下面的代码只要看完,就很容易理解它的用法和目的了。

接口法参数和值拷贝

另外就是在go语言中,其接口的实现和Java是完全不一样的,刚开始用的话,我记得当时很容易混乱。其原因就在于实现了接口的方法,传递的到底是指针呢,还是引用呢,还是值拷贝呢?其实如果熟悉其指针或者引用的用法的话,这个看起来就比较顺眼了。

package main


type I interface {
	tt()
	pp()
}

func (a *A) tt() {
	println(&(a.b))
}

func (a A) pp() {
	println(&(a.b))
}

type A struct {
	b *B
}

type B struct {
	bb string
}

func test(a I) {
	a.tt()
}
func test1(a *I) {
	aa := *a
	aa.tt()
}

func NewI() I {
	return &A{
		b: &B{bb: "bb"},
	}
}

type C struct {
	i I
}

func main() {
	a := NewI()

	switch v := a.(type) {
	case *A:
		println(&(v.b))
		v.pp()
	}
	c := &C{i: a}
	test(a)
	test1(&a)
	c.i.tt()
}

输出: 0xc00000e010 0xc000032760 0xc00000e010 0xc00000e010 0xc00000e010

大家自己体会一下。

interface 简介

一个接口是一组函数签名,它是一个特定的类型。另一种类型通过实现接口的功能来实现接口。虽然像Java或C#这样的语言明确地实现了接口,但在Go中却没有明确的意图声明。

接口的主要任务是只提供由名称、输入参数和返回类型组成的函数签名。由一个类型(如结构类型)来实现函数。

接口也被称为暴露的API或合约。如果一个类型实现了一个可排序接口的函数(API),我们就知道它可以被排序;它遵守了可排序的契约。

接口指定了行为。一个接口只包含函数的签名,但不包含它们的实现。

使用接口可以使代码更清晰、更简短、更易读。

referece

go.dev/tour/method…