Golang的接口
我不太懂界面。
如果在英和词典中查找”interface”,会出现”境界面”、”接点”、”共同的问题”等解释。
根据计算机术语词典的解释,
在支持接口和继承的对象系统中,接口是对不包含有关实现的方法的集合进行声明的。接口通常可以从其他接口继承。
从这里开始,我们将使用Go的代码来进一步理解接口。
只要满足接口的方法,即使是不同的结构体也可以赋值给接口。
1. 请用中文将以下内容改写成同义句:
type Hoge interface {
FuncA()
FuncB()
}
type Foo struct {
x string
y int
z bool
}
以上的代码中,Hoge 接口是具有 FuncA 和 FuncB 函数的集合体 = 方法的集合体。
实现部分由 Foo 负责。
实现者:Foo
接口:Hoge
首先,在实现部分的 Foo 中定义方法。
func (f *Foo) FuncA() {}
func (f *Foo) FuncB() {}
在结构体Foo中实现与Hoge接口具有相同名称的方法。
这里产生了Hoge和Foo之间的关系。
从这里开始考虑接口的作用是什么。
package main
type Hoge interface {
FuncA()
FuncB()
}
type Foo struct {
x string
y int
z bool
}
func (f *Foo) FuncA() {}
func (f *Foo) FuncB() {}
func hogehoge(d Hoge) {
d.FuncA()
d.FuncB()
}
func main() {
var hoge Hoge
hoge = &Foo{} // 型はHoge
hogehoge(hoge)
foo := &Foo{} // 型はFoo
hogehoge(foo)
}
我添加了一个名为”hogehoge”的新函数。”hogehoge”函数接受类型为Hoge的参数。
在main函数中,我准备了两个变量hoge和foo,并将它们作为参数传递给函数”hogehoge”。
需要注意的是,虽然变量hoge和变量foo具有不同的类型,但都不会引发错误。接下来我还会添加一个新的结构体。
package main
type Hoge interface {
FuncA()
FuncB()
}
// foo struct
// foo method
type HogeFoo struct {
a string
b string
c string
}
func (h *HogeFoo) FuncA() {}
func (h *HogeFoo) FuncB() {}
func hogehoge(d Hoge) {
d.FuncA()
d.FuncB()
}
func main() {
var hoge Hoge
hoge = &Foo{}
hogehoge(hoge)
foo := &Foo{}
hogehoge(foo)
hogefoo := &HogeFoo{}
hogehoge(hogefoo)
}
变量hogefoo拥有新添加的结构体HogeFoo,并正确地作为函数hogehoge的参数传入。没有发生错误。也就是说,即使变量具有不同的结构体,只要它们都满足同一个接口,就可以将它们都赋值给同一个接口。
可以将结构体的实现和使用分开来考虑。
首先添加一个新的界面。
package main
// Hoge interface
type Half interface {
FuncA()
}
// foo struct
// foo method
// HogeFoo struct
// HogeFoo method
func hogehoge(d Hoge) {
d.FuncA()
d.FuncB()
}
func half(ho Half) {
ho.FuncA()
}
func main() {
var hoge Hoge
hoge = &Foo{}
hogehoge(hoge)
foo := &Foo{}
half(foo)
hogefoo := &HogeFoo{}
half(hogefoo)
}
新添加的接口 Half只有FuncA,没有FuncB。
结构体Foo和结构体HogeFoo都满足Hoge接口和Half接口。
函数half接收类型为Half的参数,但是当把变量foo和变量hogefoo作为参数传入时,只能使用FuncA。
由于Half接口只有FuncA,这是理所当然的,但我推测这就是使用接口的有用性。
换句话说,通过接口可以明确结构体的使用方式,即使结构体实现了多个方法,使用时只需指定需要的方法,无需依赖不需要的方法。
结束
由于尚未在实际开发中使用,因此我无法完全理解它。但是,我对它的使用方式有一些模糊的想法。如果这篇文章能对别人有所帮助,我会非常高兴。感谢您阅读至最后。
请参考以下网站
Go语言接口
Golang 的 interface 是什么东西 – 到达 Gopher 之路 ②