李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
19.Golang静态类型与动态类型
Leefs
2022-07-11 PM
1918℃
0条
[TOC] ### 前言 ![19.Golang静态类型与动态类型01.png](https://lilinchao.com/usr/uploads/2022/07/2021600544.png) ### 一、概述 #### 1.1 动态类型语言和静态类型语言 + **动态类型语言** 动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段,在运行期间才去做数据类型检查。 主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。 + **静态类型语言** 静态语言的数据类型是在编译期间(或运行之前)确定的,编写代码的时候要明确确定变量的数据类型。 主要语言:C、C++、C#、Java、Object-C。 #### 1.2 GO语言类型 Go 语言是一种**静态类型的编程语言**,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么。 提前知道值的类型的好处有很多,比如编译器可以合理的使用这些值,可以进一步优化代码,提高执行的效率,减少 bug 等等。 #### 1.3 类型检查 所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行时期(动态检查)。 ### 二、GO语言接口组成 每个接口变量实际上都是由一 `pair` 对(type 和 data)组成,其中记录了实际变量的**值和类型**。 **例如:** ```go var number int = 10 ``` 这里声明了一个类型为 `int` 的变量,变量名叫 `number` 值为 `10` 。 知道了接口的组成,可以使用下面的方式定义一个变量: ```go func main() { number := (interface{})(10) //number := (int)(10) fmt.Printf("number type: %T, data: %v", number, number) } ``` **运行结果** ``` number type: int, data: 10 ``` ### 三、eface和iface `iface` 和 `eface` 都是 Go 中描述接口的底层结构体,区别在于 `iface` 描述的接口**包含方法**,而 `eface` 则是**不包含任何方法的空接口**:`interface{}`。 #### 3.1 eface **源码** ```go type eface struct { _type *_type //实体类型 data unsafe.Pointer //具体的值 } ``` **说明** `eface`主要包含实体类型`_type`指针和指向具体值的指针`data` - `_type`描述了实体类型包括内存大小、对齐方式等等,所有类型均可解释为`_type`; - `data`存储了数据的指针,即使是对于数字、字符串这样的字面值也是通过额外分配空间取指针的。 #### 3.2 iface **源码** ```go type iface struct { tab *itab data unsafe.Pointer } type itab struct { inter *interfacetype _type *_type hash uint32 // copy of _type.hash. Used for type switches. _ [4]byte fun [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter. } type interfacetype struct { typ _type pkgpath name mhdr []imethod } ``` **iface结构图** ![19.Golang静态类型与动态类型02.png](https://lilinchao.com/usr/uploads/2022/07/2867797488.png) **说明** + 在`iface`中存储的是一个`itab`指针和一个指向数据的指针。 + `itab`类型描述: + `*_type`依旧描述了实体类型包括内存大小、对齐方式等数据; + `*inter`则描述了接口自身的信息,其中的`mhdr`字段包含了接口所定义的方法; + `fun`其实是一个动态数组,虽然声明时是固定大小为1,但在使用时会直接通过`fun`指针获取其中的数据,类似于`c`语言中的不定长结构体。 *附参考文章链接* *https://www.cnblogs.com/Can-daydayup/p/15087766.html* *https://www.jianshu.com/p/8025a9d17a0c*
标签:
Golang基础
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2235.html
上一篇
18.Golang之make和new区别
下一篇
【转载】20.Golang之GMP模型
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Spark SQL
微服务
人工智能
Kafka
Typora
链表
Nacos
机器学习
Quartz
HDFS
线程池
SQL练习题
数学
JavaWEB项目搭建
Git
二叉树
JavaSE
Docker
Http
SpringCloud
数据结构和算法
Azkaban
DataX
队列
散列
VUE
BurpSuite
Ubuntu
ClickHouse
Elastisearch
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭