【golang】go语言中的静态和动态

wric

静态和动态的概念

静态

静态绑定是指在程序运行前就已经知道方法是属于那个类的,在编译的时候就可以连接到类的中,定位到这个方法。. 静态绑定发生于数据结构和数据结构间,程序执行之前。. 静态绑定发生于编译期,因此不能利用任何运行期的信息。. 它针对函数调用与函数的主体,或变量与内存中的区块。.

动态

动态绑定(后期绑定)是指在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法。. 动态绑定则针对运行期产生的访问请求,只用到运行期的可用信息。. 在面向对象的代码中,动态绑定意味着决定哪个方法被调用或哪个属性被访问,将基于这个类本身而不基于访问范围。

静态和动态的例子

image.png

静态类型语言和动态类型语言

关于静态语言和动态语言
image.png
Go语言是一门静态编译型语言,是一门强类型语言。但在go语言中也提供了类似于动态语言的功能。

和其它语言相比,Go语言是唯一结合了接口值,静态类型检查(是否该类型实现了某个接口),运行时动态转换的语言,并且不需要显式地声明类型是否满足某个接口。该特性允许我们在不改变已有的代码的情况下定义和使用新接口。
接收一个(或多个)接口类型作为参数的函数,可以被实现了该接口的类型实例调用。实现了某个接口的类型可以被传给任何以此接口为参数的函数。
类似于 Python 和 Ruby 这类动态语言中的动态类型(duck typing);这意味着对象可以根据提供的方法被处理(例如,作为参数传递给函数),而忽略它们的实际类型:它们能做什么比它们是什么更重要。

像 Python,Ruby 这类语言,动态类型是延迟绑定的(在运行时进行):方法只是用参数和变量简单地调用,然后在运行时才解析(它们很可能有像 responds_to 这样的方法来检查对象是否可以响应某个方法,但是这也意味着更大的编码量和更多的测试工作)。

Go语言的实现与此相反,通常需要编译器静态检查的支持:当变量被赋值给一个接口类型的变量时,编译器会检查其是否实现了该接口的所有函数。如果方法调用作用于像 interface{} 这样的“泛型”上,可以通过类型断言来检查变量是否实现了相应接口。

go语言中的静态函数和动态函数

动态函数

go中的接口类型实现了动态的效果:

Go语言试图让程序员能在安全和灵活的编程之间取得一个平衡。它在提供严格的类型检查的同时,通过接口类型实现了对鸭子类型的支持,使得安全动态的编程变得相对容易。
image.png
并且在go1.17中引入了泛型的概念

静态函数

由于go语言属于静态类型语言,每个变量在定义时都会被赋予固定的值。
go中也没有类的概念,每个方法与对应的变量绑定
所以在go中一般的函数和方法都是属于静态的函数

参考

https://www.cnblogs.com/wongb...
http://c.biancheng.net/view/8...
http://c.biancheng.net/view/5...

阅读 1.3k
10 声望
3 粉丝
0 条评论
10 声望
3 粉丝
文章目录
宣传栏