静态和动态的概念
静态
静态绑定是指在程序运行前就已经知道方法是属于那个类的,在编译的时候就可以连接到类的中,定位到这个方法。. 静态绑定发生于数据结构和数据结构间,程序执行之前。. 静态绑定发生于编译期,因此不能利用任何运行期的信息。. 它针对函数调用与函数的主体,或变量与内存中的区块。.
动态
动态绑定(后期绑定)是指在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法。. 动态绑定则针对运行期产生的访问请求,只用到运行期的可用信息。. 在面向对象的代码中,动态绑定意味着决定哪个方法被调用或哪个属性被访问,将基于这个类本身而不基于访问范围。
静态和动态的例子
静态类型语言和动态类型语言
关于静态语言和动态语言
Go语言是一门静态编译型语言,是一门强类型语言。但在go语言中也提供了类似于动态语言的功能。
和其它语言相比,Go语言是唯一结合了接口值,静态类型检查(是否该类型实现了某个接口),运行时动态转换的语言,并且不需要显式地声明类型是否满足某个接口。该特性允许我们在不改变已有的代码的情况下定义和使用新接口。
接收一个(或多个)接口类型作为参数的函数,可以被实现了该接口的类型实例调用。实现了某个接口的类型可以被传给任何以此接口为参数的函数。
类似于 Python 和 Ruby 这类动态语言中的动态类型(duck typing);这意味着对象可以根据提供的方法被处理(例如,作为参数传递给函数),而忽略它们的实际类型:它们能做什么比它们是什么更重要。
像 Python,Ruby 这类语言,动态类型是延迟绑定的(在运行时进行):方法只是用参数和变量简单地调用,然后在运行时才解析(它们很可能有像 responds_to 这样的方法来检查对象是否可以响应某个方法,但是这也意味着更大的编码量和更多的测试工作)。
Go语言的实现与此相反,通常需要编译器静态检查的支持:当变量被赋值给一个接口类型的变量时,编译器会检查其是否实现了该接口的所有函数。如果方法调用作用于像 interface{} 这样的“泛型”上,可以通过类型断言来检查变量是否实现了相应接口。
go语言中的静态函数和动态函数
动态函数
go中的接口类型实现了动态的效果:
Go语言试图让程序员能在安全和灵活的编程之间取得一个平衡。它在提供严格的类型检查的同时,通过接口类型实现了对鸭子类型的支持,使得安全动态的编程变得相对容易。
并且在go1.17中引入了泛型的概念
静态函数
由于go语言属于静态类型语言,每个变量在定义时都会被赋予固定的值。
go中也没有类的概念,每个方法与对应的变量绑定
所以在go中一般的函数和方法都是属于静态的函数