怎么做域名网站备案,上传网站到百度,有源码怎么搭建游戏,快手刷赞网站推广软件个人认为#xff0c;要理解 Go 的接口#xff0c;一定先了解下鸭子模型。鸭子模型那什么鸭子模型#xff1f;鸭子模型的解释#xff0c;通常会用了一个非常有趣的例子#xff0c;一个东西究竟是不是鸭子#xff0c;取决于它的能力。游泳起来像鸭子、叫起来也像鸭子#…个人认为要理解 Go 的接口一定先了解下鸭子模型。鸭子模型那什么鸭子模型鸭子模型的解释通常会用了一个非常有趣的例子一个东西究竟是不是鸭子取决于它的能力。游泳起来像鸭子、叫起来也像鸭子那么就可以是鸭子。动态语言比如 Python 和 Javascript 天然支持这种特性不过相对于静态语言动态语言的类型缺乏了必要的类型检查。Go 接口设计和鸭子模型有密切关系但又和动态语言的鸭子模型有所区别在编译时即可实现必要的类型检查。什么是 Go 接口Go 接口是一组方法的集合可以理解为抽象的类型。它提供了一种非侵入式的接口。任何类型只要实现了该接口中方法集那么就属于这个类型。举个例子假设定义一个鸭子的接口。如下type Duck interface {Quack() // 鸭子叫 DuckGo() // 鸭子走}假设现在有一个鸡类型结构如下type Chicken struct {}func (c Chicken) IsChicken() bool {fmt.Println(我是小鸡)}这只鸡和一般的小鸡不一样它比较聪明也可以做鸭子能做的事情。func (c Chicken) Quack() {fmt.Println(嘎嘎)}func (c Chicken) DuckGo() {fmt.Println(大摇大摆的走)}注意这里只是实现了 Duck 接口方法并没有将鸡类型和鸭子接口显式绑定。这是一种非侵入式的设计。我们定义一个函数负责执行鸭子能做的事情。func DoDuck(d Duck) {d.Quack()d.DuckGo()}因为小鸡实现了鸭子的所有方法所以小鸡也是鸭。那么在 main 函数中就可以这么写了。func main() {c : Chicken{}DoDuck(c)}执行正常。如此是不是很类似于其他语言的多态其实这就是 Go 多态的实现方法。空接口继续说说空 interface。如果一个 interface 中如果没有定义任何方法即为空 interface表示为 interface{}。如此一来任何类型就都能满足它这也是为什么当函数参数类型为 interface{} 时可以给它传任意类型的参数。示例代码如下package mainimport fmtfunc main() {var i interface{} 1fmt.Println(i)}更常用的场景Go 的 interface{} 常常会被作为函数的参数传递用以帮助我们实现其他语言中的泛型效果。Go 中暂时不支持 泛型不过 Go 2 的方案中似乎将支持泛型。总结回答结束做个简单总结。理解 Go 接口要记住一点接口是一组方法的集合这句话非常重要理解了这句话再去理解 Go 的其他知识比如类型、多态、空接口、反射、类型检查与断言等就会容易很多。