Frequently Asked Questions : 重载?接口声明?接口实现?

这是我参与更文挑战的第5天,活动详情查看: 更文挑战

Go为什么不支持重载方法和运算符?

如果不需要做类型匹配的话方法的调度会十分简单。其他语言的经验告诉我们,虽然一个同样名字的方法有着不同的函数签名实现偶尔会有帮助,但是同样会让人在使用的时候感到困惑。通过名字来匹配方法,保证类型的一致性是Go语言设计实现简洁化的重要决定。运算符的重载也是如此。

Go为什么不声明接口的实现?

要实现一个接口,需要实现这个接口中的方法,仅此而已。这个特性可以让你在定义和使用接口的时候,不需要修改已有的代码。这种设计类似于『结构化类型设计』,它分离了关注点,提升了代码可重复使用性,同时能够在一个模板上快速搭建代码,接口的设计是GO实现敏捷和轻量化的重要原因之一。

nimble 敏捷的,轻巧的,灵活的
复制代码

怎么确保我的真的实现了一个接口?

你可以借助编译器来检查T是否实现了接口I,通过下面这种空值或者空指针的方式:

// Verify that T implements I.  
// (PS:接口可以承接他的实现,如果无法承接,说明没有实现对应接口)
// 下面这种就不会报错
// 但是如果把T的find方法去掉,就会报错
type T struct {

}

func (t T) find(){

}

type I interface{
	find()
}

func testSatisfy(){
	var i I
	i = T{}
    fmt.Println(i)
}
复制代码

如果你希望接口的使用方显式的声明它们实现了这个接口,你可以添加一个描述性的方法在接口上,这个方法可以是空内容,但是就是为了 表达,它实现了某个接口。如下:

type Fooer interface {
    Foo()
    ImplementsFooer()
}
复制代码

这样的话,一个类型就必须实现ImplementsFooer这个方法。类似如下:

type Bar struct{}
func (b Bar) ImplementsFooer() {}
func (b Bar) Foo() {}
复制代码

大部分的代码不会这么使用,因为它破坏了接口的简洁性,不过对于一些相似的、容易混淆的接口,这么做是必须的。(PS:不推荐)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享