【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.5k
10 声望
0 粉丝
0 条评论
推荐阅读
【k8s系列】scheduler
kube-scheduler的根本工作任务是根据各种调度算法将Pod绑定(bind)到最合适的工作节点,整个调度流程分为两个阶段:预选策略(Predicates)和优选策略(Priorities)。

wric阅读 234

Go 泛型
泛型是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。

guyan03192阅读 518

封面图
Gin + GORM 入门到实战
Hello,大家好,我是海军,最近一直在学习Go,目前在做项目熟悉Go 阶段。 本文来分享一下 Gin + GORM 的一些 开发体验,有喜欢Go 方向的朋友,欢迎一起交流学习呀!后续会更新实战项目,目前在实现一个 技术论坛...

程序员海军2阅读 635

封面图
技术征文中奖名单公布 丨浅谈 Go 语言框架
哈喽社区的小伙伴!SegmentFault 思否技术征文丨浅谈 Go 语言框架 活动开奖啦~话不多说,我们直接来揭晓获奖名单!插播一条预告:年度有奖征文马上也要来咯,欢迎大家多多关注「SegmentFault思否」参与征文活动。...

SegmentFault思否3阅读 226

动图图解!怎么让goroutine跑一半就退出?
本文参与了思否技术征文,欢迎正在阅读的你也加入。光看标题,大家可能不太理解我说的是啥。我们平时创建一个协程,跑一段逻辑,代码大概长这样。 {代码...} 注意这上面"打印2"是在defer中的,所以会在函数结束前...

小白debug1阅读 576

快收藏!最全GO语言实现设计模式【下】
导语| 继上篇【快收藏!最全GO语言实现设计模式】,本文继续列出GO语言实现的经典设计模式示例,每个示例都精心设计,力求符合模式结构,可作为日常编码参考,同时一些常用的设计模式融入了开发实践经验总结,帮...

腾讯云开发者1阅读 188

SegmentFault 思否技术周刊 Vol.71 — 解读 Go 语言
通过这篇文章我们已经掌握了 gRPC 相关的知识点,可以独立用 Go 实现客户端和服务端的编写,并且通过服务注册对外提供服务,实现可客户端和服务端的 gRPC 通信。

Beverly3

封面图
10 声望
3 粉丝
宣传栏