当前位置: 首页 > news >正文

34. 图解 Go 语言:静态类型与动态类型

转载自::github.com/iswbm/GolangCodingTime

在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。

我的在线博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime


1. 静态类型#

所谓的静态类型(即 static type),就是变量声明的时候的类型。

var age int   // int 是静态类型
var name string  // string 也是静态类型

它是你在编码时,肉眼可见的类型。

2. 动态类型#

所谓的 动态类型(即 concrete type,也叫具体类型)是 程序运行时系统才能看见的类型。

这是什么意思呢?

我们都知道 空接口 可以承接什么问题类型的值,什么 int 呀,string 呀,都可以接收。

比如下面这几行代码

 
var i interface{}   
i = 18  
i = "Go编程时光"  

第一行:我们在给 i 声明了 interface{} 类型,所以 i 的静态类型就是 interface{}

第二行:当我们给变量 i 赋一个 int 类型的值时,它的静态类型还是 interface{},这是不会变的,但是它的动态类型此时变成了 int 类型。

第三行:当我们给变量 i 赋一个 string 类型的值时,它的静态类型还是 interface{},它还是不会变,但是它的动态类型此时又变成了 string 类型。

从以上,可以知道,不管是 i=18 ,还是 i="Go编程时光",都是当程序运行到这里时,变量的类型,才发生了改变,这就是我们最开始所说的 动态类型是程序运行时系统才能看见的类型。

3. 接口组成#

每个接口变量,实际上都是由一 pair 对(type 和 data)组合而成,pair 对中记录着实际变量的值和类型。

比如下面这条语句

var age int = 25

我们声明了一个 int 类型变量,变量名叫 age ,其值为 25

知道了接口的组成后,我们在定义一个变量时,除了使用常规的方法(可参考:02. 学习五种变量创建的方法

也可以使用像下面这样的方式

package main 
import "fmt" 
func main() {age := (int)(25) //或者使用 age := (interface{})(25) fmt.Printf("type: %T, data: %v ", age, age) 
}

输出如下

type: int, data: 25 

4. 接口细分#

根据接口是否包含方法,可以将接口分为 iface 和 eface

iface#

第一种:iface,表示带有一组方法的接口。

比如

type Phone interface { call() }

iface 的具体结构可用如下一张图来表示

iface 结构

iface 的源码如下:

// runtime/runtime2.go
// 非空接口
type iface struct {tab  *itabdata unsafe.Pointer
}// 非空接口的类型信息
type itab struct {inter  *interfacetype  // 接口定义的类型信息_type  *_type      // 接口实际指向值的类型信息link   *itab  bad    int32inhash int32fun    [1]uintptr   // 接口方法实现列表,即函数地址列表,按字典序排序
}// runtime/type.go
// 非空接口类型,接口定义,包路径等。
type interfacetype struct {typ     _typepkgpath namemhdr    []imethod      // 接口方法声明列表,按字典序排序
}
// 接口的方法声明 
type imethod struct {name nameOff          // 方法名ityp typeOff                // 描述方法参数返回值等细节
}

eface#

第二种:eface,表示不带有方法的接口

比如

 

var i interface{}

eface 的源码如下:

// src/runtime/runtime2.go
// 空接口
type eface struct {_type *_typedata  unsafe.Pointer
}

eface 结构组成

5.理解动态类型#

前两节,我们知道了什么是动态类型?如何让一个对象具有动态类型?

后两节,我们知道了接口分两种,它们的内部结构各是什么样的?

那最后一节,可以将前面四节的内容结合起来,看看在给一个空接口类型的变量赋值时,接口的内部结构会发生怎样的变化 。

iface#

先来看看 iface,有如下一段代码:

var reader io.Reader tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)
if err != nil {return nil, err
}reader = tty

第一行代码:var reader io.Reader ,由于 io.Reader 接口包含 Read 方法,所以 io.Reader 是 iface,此时 reader 对象的静态类型是 io.Reader,暂无动态类型。

最后一行代码:reader = tty,tty 是一个 *os.File 类型的实例,此时reader 对象的静态类型还是 io.Reader,而动态类型变成了 *os.File

eface#

再来看看 eface,有如下一段代码:

//不带函数的interface
var empty interface{}tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)
if err != nil {return nil, err
}empty = tty

第一行代码:var empty interface{},由于 interface{} 是一个 eface,其只有一个 _type 可以存放变量类型,此时 empty 对象的(静态)类型是 nil。

最后一行代码:empty = tty,tty 是一个 *os.File 类型的实例,此时 _type 变成了 *os.File

6. 反射的必要性#

由于动态类型的存在,在一个函数中接收的参数的类型有可能无法预先知晓,此时我们就要对参数进行反射,然后根据不同的类型做不同的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-35058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

Keyhole Markup Language (KML)

5. KML-Keyhole Markup Language From https://developers.google.com/kml/documentation/kml_tut?hlzh-CN KML 是一种文件格式,用于在地球浏览器(例如 Google 地球、Google 地图和谷歌手机地图)中显示地理数据。KML 使用含有嵌套的元素和…...

idea复制当前行快捷键

仅作为记录,大佬请跳过。 在该行的任何位置,直接用ctrl和c即可 参考 感谢大佬博主文章:传送门...

不抛弃异常值的几种情况

异常数据是数据分布的常态,处于特定分布区域或范围之外的数据 通常会被定义为异常或“噪音”。产生数据“噪音”的原因很多,例如业务 运营操作、数据采集问题、数据同步问题等。对异常数据进行处理前, 需要先辨别出到底哪些是真正的数据异常。 从数据异常的状态看分为两 种…...

23种设计模式

一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多…...

Nacos 2.0.2正式版发布

一、介绍Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用…...

spring框架的各种注解基本意思

//在 spring 配置文件中开启生成代理对象 <!-- 开启 Aspect 生成代理对象--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>Autowired //根据属性类型进行自动装配 Aspect //生成代理对象 Qualifier //根据名称进行注 Resource //可以根据类型注…...

【Java45】旅游案例:数据回显,注销/退出,首页类别显示,精选

文章目录1.登陆数据回显1.1 前端2.登陆案例_注销/退出3.首页类别显示3.1 web3.2 service3.3 dao4.精选4.1 web4.2 service4.3 dao4.4 前端1.登陆数据回显 如上前端写在header.html中。 1.1 前端 //header.html <!-- 头部 start --><header id"header2"&g…...

axios跨域问题

项目配置 vue-cli3vue2element-ui-2.15.3 在网上找了很多方案&#xff0c;但是都没有生效&#xff0c;最后是前端添加了一段代码&#xff0c;后台添加了一段代码 解决了 添加了headers的配置 const instance axios.create({// baseURL: http://mall.huolida.com/,// baseUR…...

原创-Kafka原理

Kafka原理 2017年09月22日 22:39:45317人阅读 评论(0) 收藏 举报 分类&#xff1a; Kafka&#xff08;1&#xff09; 目录(?)[] Kafka 这段时间研究RabbitMQ、Kafka、RocketMQ消息队列&#xff0c;发现对她们原理的介绍都过于简单&#xff0c;所以整理了众多资料&…...

ef dbcontext

dbcontext class 用来crud数据库&#xff0c;也用来配置实体类&#xff0c;关系映射&#xff0c;缓存&#xff0c;事务&#xff0c;变化追踪等 using System.Data.Entity;public class SchoolContext : DbContext {public SchoolContext(){}// Entities public DbSet&l…...

C语言中的整型提升

C语言中的整型提升 提到整型提升,可能刚学c语言的小伙伴们很头疼这个知识点吧,下面我就我的理解简单分析一下整型提升是怎么回事. 首先还是介绍一下整型提升的概念: ​ c的整型算术运算总是至少以缺省整型类型的精度来进行的. 为了获得这个精度,表达式中的字符和短整型操作数在…...

浅入浅出实现一个异步求和函数

简化&#xff1a;两数之和 我们先来简单的实现一个异步两数之和函数 function sumT(a, b) {return await new Promise((resolve, reject) > {asyncAdd(a, b, (err, res) > {if(!err) {resolve(res)}reject(err)})}) }// 测试 const test await sumT(1, 2) console.log…...

unity学习笔记(一)

unity基础简介&#xff08;一&#xff09; unity是如何跨平台的&#xff08;附c和c#编译过程&#xff09; 前言 游戏引擎为了兼顾易用性和性能&#xff0c;往往使用一种高效率语言编写核心&#xff0c;使用另一种高级语言作为脚本语言&#xff0c;大部分游戏引擎的底层核心由…...

Python大数据分析学习基础篇(3)——数据结构

一、函数部分 1、闭包 所谓闭包其实跟回调函数有有相通之处。闭包可以延长作用时间和作用域。 def say(word):def name(name):print(word,name)return name hi say(你好) hi("小明") bye say("再见") bye("小明 ") 运行结果&#xff1a; …...

线程的安全性 - 并发基础篇

简介 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就说这个类是线程安全的。 目录 这次分三步走&#xff1a;关于相关知识点&#xff0c;放在文末的脑图里了&#xff0c;大家想看结论的&#xff0c;可直接下拉观看哦。 1.创建一个线…...

栈?队列?Java ArrayDeque常用首尾操作方法整理

对于用Java刷leetcode的同学一定很眼熟ArrayDeque这个数据结构&#xff0c;因为它既可以作为队列也可以作为栈&#xff0c;解题时使用频率很高。补充一嘴&#xff0c;Stack也能作为栈来用&#xff0c;但是作为存在设计缺陷的Vector类的子类&#xff0c;已经不推荐使用了。 Arr…...

开发程序流程

JavaWeb程序--> 将一个请求路径( 网络地址) 变成一条sql语句&#xff0c;发送给数据库进行查询&#xff1b; 会将获取的数据&#xff0c;通过页面的方式&#xff0c;展示给用户进行操作&#xff1b; Javaweb程序如何将一个路径变成一条sql语句&#xff1f;...

从入门到放弃:Markdown中的LaTeX使用教程

LaTeX CSDN不支持显示的语法我已用 标注显示 基本语法 展现形式 在正文中的LaTeX公式用$...$定义行内公式&#xff0c;$$...$$单独居中显示 希腊字母 显示命令显示命令α\alphaβ\betaγ\gammaδ\deltaε\epsilonζ\zetaη\etaθ\thetaι\iotaκ\kappaλ\lambdaμ\muν\…...

----- ElasticSearch -----

1.什么是RestFul 2.什么是全文检索 3.什么是Elastic Search 开源 Apache Lucen 工具包 java api特别多 solr 全文检索服务器 底层封装了lucene ElasticSearch 开源搜索引擎 java 4.ES中基本概念 1&#xff09;接近实时(NRT Near Real Time 2&#xff09;索引(index) 3&am…...

PO / PO和 ERP的配置

一、前言 PO / PI 是SAP公司的一个中间件产品&#xff0c;用来辅助SAP系统和外围系统&#xff0c;( 当然外围系统也可以使用PO)。 PO可以完成一些数据内容转换,群发(一份数据发给多个异构系统),分发(数据区分特征发送给特定的系统)等功能. 二、ERP端 ERP和 PO的连接&#x…...

Hive表类型(存储格式)

转载专用&#xff1a;读到了好文章&#xff0c;用于分享收藏&#xff0c;侵权删。转发自大佬&#xff1a;桥路丶 &#xff0c;https://blog.csdn.net/qq_33876553版权声明&#xff1a;本文为CSDN博主「桥路丶」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载…...

object.assgin

对象赋值 我在vue中进对象赋值进行遇到其对象的observer id改变了 例子&#xff1a; 创建时控制台 图1&#xff1a; 点击后 图2&#xff1a; 为什么会遇到这种问题 其实是因为我们在进行对象赋值的时候是进行了直接赋值&#xff0c;直接赋值会照成其对象的指针改变了指向&…...

git 替换commit的账户与邮箱信息 GitLab: Committer‘s email does not follow the pattern

最终解决方法来源&#xff1a; https://segmentfault.com/q/1010000006999861 https://www.cnblogs.com/zh7791/p/12986083.html ① git rebase -i HEAD~N N代表前N次的提交记录 ② 出现记录后键入i进入INSERT模式&#xff0c;在需要修改的条目上&#xff0c;将pick改为edit…...

Java学习五阶段-RabbitMQ-SpringBoot整合

文章目录 新建项目pom.xmlapplication.yml主程序 简单模式主程序生产者消费者测试类 工作模式主程序生产者消费者测试类 ack模式设置 ack 模式手动执行确认操作 抓取数量发布和订阅模式主程序生产者消费者测试类 路由模式主程序生产者消费者测试类 主题模式主程序生产者消费者测…...

----- ElasticSearch -----

1.什么是RestFul 2.什么是全文检索 3.什么是Elastic Search 开源 Apache Lucen 工具包 java api特别多 solr 全文检索服务器 底层封装了lucene ElasticSearch 开源搜索引擎 java 4.ES中基本概念 1&#xff09;接近实时(NRT Near Real Time 2&#xff09;索引(index) 3&am…...

光线跟踪算法技术 笔记

P53 这里好像QT 哈哈...

防火墙高可靠性

双机热备、BFD双向转发检测、IP-LINK链路检测、Link-Group逻辑组、ETH-Trunk链路捆绑、Bypass&#xff0c;跨数据中心集群&#xff0c;双主控、业务板备份、数据中心会话同步 双机热备 目的&#xff1a;为了防止单点故障 实现&#xff1a;两台硬件软件相同的FW之间通过一条独…...

SQL server安装时显示重启计算机失败问题解决办法

SQL server安装时显示重启计算机失败问题解决办法参考文章&#xff1a; &#xff08;1&#xff09;SQL server安装时显示重启计算机失败问题解决办法 &#xff08;2&#xff09;https://www.cnblogs.com/netflix/p/12074481.html 备忘一下。...

MATLAB基础语法之拟合算法

%data1.mat数据如下 %导入data1的数据 load data1%以x为自变量&#xff0c;y为因变量&#xff0c;o为点的形状作散点图 plot(x,y,o)% 给x和y轴加上标签 xlabel(x的值)ylabel(y的值)%返回data1数据行数n 19 n size(x,1); %最小二乘法求解拟合曲线参数 k (n*su…...

小码哥【Java从0到架构师】wangpan学习记录

Java 从 0 到 架构师 第一阶段&#xff1a;Java 基础语法 第二阶段&#xff1a;JavaEE 基石 基本概念 环境搭建 Servlet_JSP MySQL 基础 多表查询 JDBC、Spring JDBC、JUnit JS_jQuery_BootStrap Maven 会话跟踪 Cookie_Session Filter_Listener_AJAX 第二阶段项目实战 - 个人…...

现代密码学1.2--Kerckhoffs原则

现代密码学1.2--Kerckhoffs原则Kerckhoffs principle博主正在学习INTRODUCTION TO MODERN CRYPTOGRAPHY (Second Edition) --Jonathan Katz, Yehuda Lindell&#xff0c;做一些笔记供自己回忆&#xff0c;如有错误请指正。整理成一个系列现代密码学&#xff0c;方便检索。 Ker…...

基于Android的学生信息管理App设计(Android studio开发)

目 录 一、 题目选择&#xff08;题目、选题意义&#xff09; 3 二、 设计目的 3 1、 初衷 3 2、 结合实际 3 3、 使用工具 3 三、 最终页面效果展示 4 1、 登陆界面 4 2、 主界面 5 3、 各个功能模块 6 四、 各部分设计 11 1、活动页面Activity布局文件 11 2、Activity的编程 …...

裸金属是什么?

媳妇儿问“裸金属”是什么&#xff1f;显然不是指这个&#xff0c;毕竟据我所知&#xff0c;我们所处的行业尚未直接开展建筑工程&#xff0c;裸金属&#xff0c;是直译过来的&#xff0c;英文名称是Bare Metal&#xff0c;或者被称作Bare Machine&#xff0c;但是前者听起来更…...

oracle 裸金属,通过裸金属服务部署Oracle RAC (五)Oracle RAC的备份

求楼上高人指点 我这边挂载的时候报错 如何是好[oraclerdt-test lib]$ java -jar osbws_install.jar -AWSID ak_id -AWSKey sk_id -walletDir $ORACLE_HOME/osbws_wallet -libDir $ORACLE_HOME/lib -location eu-de -awsEndPoint obs.eu-de.otc.t-systems.com -libPlatform lin…...

简单聊聊 Ironic 是如何管理裸金属的

上一篇文章里我简单介绍了一下「裸金属」的概念&#xff0c;提到了 OpenStack 中的核心项目 Ironic&#xff0c;今天继续来聊聊它。 Bare Metal 所以用 Bear 来做吉祥物&#xff0c;谐音梗很好玩嘛 在介绍 Ironic 之前&#xff0c;我们必须要对服务器是怎么管理的有个基本认识。…...

国内唯一系统教程资料Nuttx操作系统移植教程—PIXAWK飞控平台移植必备

我们筹备大半年之久的 Nuttx操作系统移植视频教程套件 终于在年前可以发布了 我们知道Ardupoilt固件和PX4固件的飞控系统都是基于Nuttx这个操作系统的&#xff0c;这个操作系统是一个类似LINUX的操作系统&#xff0c;具有非常好的实时性和可扩展性&#xff0c;在飞控这一类设备…...

DIY智能小车篇(三):功能模块之遥控、蓝牙、MERGE

遥控模式 此模式可以利用遥控器完成模式的选择和小车前进后退等驱动功能&#xff0c;模式选择放在最后MERGE部分进行介绍。通讯协议直接用的YFRobot工作室写好的&#xff0c;方便实用&#xff0c;自己其实只需要会用就OK啦。通讯协议部分的程序这里就不贴啦&#xff0c;网上都能…...

Vue3 学习笔记 —— 自动导入 Vue3 APIs、v-model

目录 1. 自动导入 Vue3 APIs —— unplugin-auto-import/vite 2. v-model 2.1 相较于 Vue2&#xff0c;Vue3 做出了哪些变化&#xff1f; 2.2 绑定一个 v-model 2.2.1 父组件 2.2.2 子组件 2.3 绑定多个 v-model 2.3.1 父组件 2.3.2 子组件 2.4 v-model 中的自定义修…...

PikaScript实践记录(1)之hello world

PikaScript实践记录之"hello world !" Author&#xff1a;onceday Date&#xff1a;2022年8月26日 也信美人终做土&#xff0c;不堪幽梦太匆匆&#xff01; 前言&#xff1a; 本文章基于PikaScript脚本语言在阿波罗Stm32F429开发板的实践记录。PikaScript是跨平台…...

《STM32从零开始学习历程》——CAN通讯协议协议层

《STM32从零开始学习历程》EnzoReventon CAN通讯协议协议层 相关链接&#xff1a; 《STM32从零开始学习历程》——CAN通讯协议物理层 CAN&#xff0d;bus规范 V2.0版本 CAN总线入门 周立功-CAN协议中文版 参考资料&#xff1a; [野火EmbedFire]《STM32库开发实战指南——基…...

毕业设计| STM32F407智能汽车:功能全网最全,代码开源。看评论区领相关项目资料

这大概是全网功能最多的小车了&#xff0c;做个毕设&#xff0c;有必要这么卷吗&#xff1f;最近咱们的毕设分享和车杠上了 小车8大功能演示 STM32小车功能介绍 小车的硬件部分使用了以STM32F407VET6最小开发板为核心板&#xff0c;内部结合&#xff1a;温湿度模块、烟雾浓度…...

基于STM32F103C8T6通过WIFI模块(ESP8266)控制小车

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、材料准备 二、原子云固件下载 三、实验步骤 1.基本AT指令 2.串口接收中断 3.&#xff45;&#xff53;&#xff50;8266代码 4.主函数 5.电机驱动模块 总结 前…...

STM32 CAN通信的学习笔记总结(从小白开始)

知识来源于互联网&#xff0c;回馈于互联网&#xff01;   目录1. 总体概述1.1 基本概念1.2 通讯方式1.3 为什么使用CAN?1.4 CAN的协议及组成2. 上帝视角看CAN的通讯过程2.1 数据传输原理实现2.2 通信的整个过程2.2.1 空闲状态2.2.2 开始数据传输2.2.3 仲裁机制2.2.4 位时序2…...

培训第一天网页设计知识点

网页基础知识&#xff1a; B/S:浏览器/服务器 C/S:客户机/服务器 &#xff08;资源在本地&#xff09; html:超文本标记语言&#xff08;定义元素&#xff09; css层样式表&#xff08;布局和变化&#xff09; javaScript脚本语言&#xff08;实现网页交互&#xff09; 基…...

实现数据库与前端交互的小demo

前言 小白学习过程中练习小样&#xff0c;涉及最简单的前端页面以及基础的servlet和数据库连接&#xff0c;本篇只写流程。大概是一些培训机构试听课中会讲的&#xff0c;比较浅显。文章仅用于小白自己梳理业务思路&#xff0c;权当锻炼一下思维。 逻辑结构 每块代码要实现的功…...

Part6:客户端和服务端信息交互模型

一、客户端和服务端信息交互模型 1.【问题】&#xff1a;什么是客户端和服务端&#xff1f; 客户端&#xff1a;可以向服务器发请求&#xff0c;并接收返回的内容进行处理服务器端&#xff1a;能够接收客户端请求&#xff0c;并且把相关资源信息返回给客户端的 2.【面试题】&a…...

家庭用户无线上网案例(AC通过三层口对AP进行管理)

组网需求 为一个家庭用户使用的网络架构。该家庭消费用户的上网流量大多是低速流量&#xff0c;例如浏览网页、玩游戏、看视频等。家庭成员使用的无线终端主要为手机、PC、电视机等。终端接入的数量正常情况下在10个以内&#xff0c;偶尔有家庭聚会等特殊情况&#xff0c;终端接…...

java+ee,pdf_Java_EE互联网轻量级框架整合开发pdf

下载地址&#xff1a;网盘下载随着移动互联网的兴起&#xff0c;以Java技术为后台的互联网技术占据了市场的主导地位&#xff0c;而在Java互联网后台开发中&#xff0c;SSM框架(SpringSpring MVCMyBatis)成为了主要架构&#xff0c;《Java EE互联网轻量级框架整合开发——SSM框…...

完整的 Hexo 整合 pdf.js 过程(亲测有效!)

文章目录前言1、安装 hexo-pdf2、修改项目的 _config.yml配置3、在source\_posts下创建目录&#xff0c;放入pdf文件4、创建与上面目录相同名的md文件5、保存启动即可6、预览效果前言 这段时间想要在线预览自己的PDF&#xff0c;于是在网上找了许多相关的资料&#xff0c;发现…...

Asciidoctor 与 gradle 整合生成 PDF备忘

缘起 简单文档一般使用 markdown 就足够了&#xff0c;尤其单页文档&#xff0c;不过稍微复杂点的文档用这玩意显然就很不方便了&#xff0c;就单单一个不支持 include 就很痛苦&#xff0c;虽然可以用 pandoc 做一些 hack 处理&#xff0c;不过麻烦啊&#xff0c;尤其还需要生…...