Golang数据类型(数字型)

Go数据类型(数字型)

Go中数字型数据类型大致分为整数(integer)、浮点数(floating point )和复数(Complex)三种

整数重要概念

整数在Go和Python中有较大区别,主要体现在Go对整数的划分更细。Go中同时提供了 有符号(signed)无符号(unsigned) 的整数类型,其中有符号整数按二进制位又可以分为int8(对应8bit大小的有符号整数),int16(对应16bit大小的有符号整数),int32(对应32bit大小的有符号整数),int64(对应64bit大小的有符号整数),以及int(与CPU相关)五种类型。无符号整数按二进制位又可以分为uint8, uint16, uint32, uint64以及uint五种类型。

根据二进制大小的不同,每种有符号整数和无符号整数类型所代表的整数范围也不尽相同,如下表所示:

  • 有符号整数和无符号整数的最大的区别是前者支持负数,后者不支持。另外int这个整数类型我们在前面讲解变量时所举的例子中已经提及并使用过了,它的大小与所代表的整数范围和运行Go程序的机器的编译器和CPU相关(既可能是32bit也可能是64bit,uint同理)。实际开发中int类型的应用最为广泛,它既可用于数组和切片的索引,也可用于for循环中空值循环次数的计数器,而且一般来说int类型的处理速度也是最快的
  • 除int和uint之外,还有一个大小及所代表的整数范围和编译器及CPU相关的整数数据类型叫做uintptr,它只在Go语言和C语言之间互动的底层编程中才会用到

整数使用举例

整数支持加减乘除、取模等操作,但前提是变量的整数类型必须一致,并且数字不能超出该类型的整数范围,举例如下:
func main() {var a, b int = 7, 2fmt.Println(a + b)fmt.Println(a - b)fmt.Println(a * b)fmt.Println(a / b)
}

 

注意Go中当两个整数不能整除时,只保留商数,因此7/2返回的值为3

如果变量的整数类型不一致,则系统会返回异常,举例如下:

func main() {var a int8 = 1var b uint8 = 1fmt.Println(a + b)
}

 

 

这里变量a的数据类型为int8,而b的数据类型为uint8,两者无法做任何运算。

如果数字超出了数据类型对应的整数范围,则系统也会返回异常,举例如下:

func main() {var a int8 = 256fmt.Println(a)
}

 

这里变量a的值256超出了int8对应的支持范围(-128到127)。

如果使用简短格式声明整数变量,则该整数变量的类型为int,大小视CPU的类型为32bits或者64bits。举例如下:

func main() {a := 10fmt.Printf("%T\n", a)
}

 

另外也可以使用整数类型相关的函数将一个类型的整数转换成另一个类型的整数,如下所示:

func main() {a := 10        //此时a为int类型的整数b := uint32(a) //将a转换为uint32类型的整数c := int8(a)   //将a转换为int8类型的整数fmt.Println(b, c)fmt.Printf("%T\n", a)fmt.Printf("%T\n", b)fmt.Printf("%T\n", c)
}

输出:

 

浮点数

浮点数用来表示带有小数点的数字,比如1.0,-45.332。在Go中浮点数分为float32和float64两种类型,两种类型代表了两种精度

float32 vs float64

float32类型的浮点数和float64类型的浮点数两者区别在于前者为单精度浮点数,可以提供约6个十进制数的精度,在内存中占用32个bits,而后者为双精度浮点数,可以提供约15个十进制数的精度,在内存中占用64个bits
func main() {var f1 float32 = 16777216fmt.Println(f1 == f1+1)var f2 float64 = 16777216fmt.Println(f2 == f2+1)
}
输出:

 

这里我们用float32和float64分别创建了两个变量f1和f2,它们的值都为16777216(整数同样可以赋值给浮点数类型的变量),但是如果给它们各自加上1后再用==做判断,可以看到类型为float32的变量f1 == f1+1返回了布尔值true,类型为float64的变量f2 == f2+1返回了布尔值false。其原因是因为在IEEE 754标准中,32位的浮点数其构成为:

Value = (sign ? -1 : +1) * 2^exponent * (1.0 + mantissa)

  • Value即为浮点数的值
  • 1个bit用于符号位 (sign bit),符号位用来判断判断正数或负数(+1表示正数,-1表示负数)
  • 8个bit用于指数(exponent,带有-127的偏移)
  • 23个bit用于尾数 (mantissa)

可以看到16777216对应的是224,如果用float32来表示的话:

  • 符号位(sign bit) = +1 (表示正数)
  • 指数 = 24 (保存在内存中的二进制为10010111,这个10010111是从24 + 127(指数偏移) = 151=10010111得来的)
  • 尾数 = .0(即小数点后的小数为0)

因此Value = (+1) x 224 x (1.0 + .0) = 16777216

再来看16777217,也就是224+1:

  • 符号位和指数不变
  • 尾数必须为2-24因为只有这样Value才会= (+1) x 224 x (1.0 + 2-24) = 16777217
  • 但是因为尾数位只有23bit,因此用float32是无法表示16777217的。在float32中,16777217会以16777216表示,不会以16777218表示,这涉及到向最近的值舍入(round to nearest)的知识点,该知识点不在本书的讨论范围内。

由此可以看出float32能精确表示的正整数并不是很大,所以通常我们用float64来声明浮点数变量。不过使用float64也就意味着程序会占用更大的内存,在深度学习这种需要大使用数据集的领域,占用内存的多少会对系统运行效率有较为明显的影响。

整数和字符串互相转换

整数转换为字符串

整数转换为字符串大致有三种方法:

  1. 使用string()
  2. 使用strconv.ItoA()
  3. 使用strconv.Format()
第一种使用string()的方法和后面两种使用strconv包的方法有本质上的区别。对整数使用string()函数的话,其返回的值不是字符串形式的整数,而是该整数对应的字符rune,举例如下:
func main() {num := 100fmt.Println(string(num))
}
输出:

 

可以看到对整数100使用string()并未将其转化为字符串形式的整数"100",而是该整数对应的字符"d"。

然后编辑器里面已经明显的提示我需要使用哪个函数去实现转换了

如果你的目的是将一个整数转换为该整数的字符串形式,则需要使用strconv.ItoA()或者strconv.Format(),举例如下:

func main() {num := 100fmt.Println(strconv.Itoa(num))fmt.Println(strconv.FormatInt(int64(num), 10))
}

输出:

 

其中strconv.Itoa()函数里的Itoa是Integer to ASCII的缩写,

strconv包下的Itoa()是最简易也最常用的将整数转换为字符串的函数,推荐使用

而与strconv.Itoa()相对应的则是strconv.Atoi(),即ASCII to Integer,表示将字符串转换为整数

strconv.FormatInt()函数比较严格,要使用的话必须传入两个参数

第一个参数必须为int64的有符号整数,因为我们创建的变量的数据类型为int,不是int64,因此需要用int64(num)将其转化为int64才能作为合法的参数传入。

第二个参数为进制,这里的10表示十进制,如果想用十六进制表达的话,则将10改为16即可

字符串转换为整数:

字符串转换为整数大致两种方法,除了前面提到的strconv.Atoi()外,也可以用strconv.ParseInt()来完成。

先举例讲讲strconv.Atoi()

func main() {str := "100"fmt.Println(strconv.Atoi(str))
}

输出:

这里可以看到,对字符串变量str使用strconv.Atoi()后,返回的值为100 <nil>,为什么会有两个值?这是因为strconv.Atoi()函数本身默认会返回两个值,第一个值的数据类型为整数,第二个值的数据类型为error,我在讲字符串一章中提到了错误类型在Go中也属于一种数据类型,如果调用该函数时存在错误的话,比如被strconv.Atoi()转换的数据为非字符串,那么strconv.Atoi()会返回具体的错误类型,如果函数运行后不存在错误的话,则返回nil。在Go中类似strconv.Atoi()这种同时返回两种值(一种为函数本身因返回的值,另一种为错误类型的值)的函数还有很多

再看一下strconv.Atoi()的语法:

再来看strconv.ParseInt()的使用:

func main() {str := "100"fmt.Println(strconv.ParseInt(str, 10, 64))
}

输出:

可以看到,strconv.ParseInt()需要传入三个参数,

一个参数为要被转换为整数的字符串

第二个参数为进制,这里的10代表十进制,

第三个参数代表的是bitSize, 其作用是用来指定我们想将字符串转换为哪类的有符号整数类型,其取值范围为0,8,16,32,64,分别表示int, int8, int16,int32和int64。

Strconv.FormatInt()和strconv.ParseInt()功能比较强大,但是使用起来稍微有些繁琐,明显strconv.Itoa()和strconv.Atoi()更易用。实际上strconv.Itoa()和strconv.Atoi()其实分别调用了strconv.Format()和strconv.ParseInt(),是后两者的简化版

 

另外Format和Parse其实是两组相反的方法,除了strconv.FormatInt()和strconv.ParseInt()外还有如下很多种类似的函数:

Format组:

FormatBool()

FormatFloat()

FormatInt()

FormatUint()

Parse组:

ParseBool()

ParseFloat()

ParseInt()

ParseUint()

总体来说,Format组是将其他数据类型转变成字符串,而Parse组是将字符串转为其他数据类型

  转载至: 网络工程师的Golang之路 -- Go数据类型(数字型) - 知乎 (zhihu.com)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++的explicit和隐式转换

隐式转换是指在某些情况下&#xff0c;编译器会自动进行类型转换&#xff0c;将一种类型的值转换为另一种类型&#xff0c;以满足表达式的要求。这种转换是隐式进行的&#xff0c;不需要显式地调用转换函数或构造函数。 int a 5; double b a; // int 到 double 的隐式转换上…

利用 FormData 实现文件上传、监控网路速度和上传进度

利用 FormData 实现文件上传 基础功能&#xff1a;上传文件 演示如下&#xff1a; 概括流程&#xff1a; 前端&#xff1a;把文件数据获取并 append 到 FormData 对象中后端&#xff1a;通过 ctx.request.files 对象拿到二进制数据&#xff0c;获得 node 暂存的文件路径 前端…

【c++|SDL】开始使用之---demo

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 SDL 记录 1. hello word #include<SDL2/SDL.h>SDL_Window* g_pWindow 0; SDL_Renderer* g_pRenderer 0;int main(int argc, char* args[]) {//…

黄金比例设计软件Goldie App mac中文版介绍

Goldie App mac是一款测量可视化黄金比例的工具。专门为设计师打造&#xff0c;可以帮助他们在Mac上测量和可视化黄金比例&#xff0c;从而轻松创建出完美、平衡的设计。 Goldie App mac体积小巧&#xff0c;可以驻留在系统的菜单栏之上&#xff0c;随时提供给用户调用。 拥有独…

Dart编程基础 - 一种新的编程语言

Dart编程基础 – 一种新的编程语言 Dart Programming Essentials - A New Type of Programming Language By JacksonML Dart is a client-optimized language for fast apps on any platform From dart.dev 在1999年之前&#xff0c;和我一样对计算机技术感兴趣的伙伴们&…

面试篇spark(spark core,spark sql,spark 优化)

一&#xff1a;为什么学习spark&#xff1f; 相比较map-reduce框架&#xff0c;spark的框架执行效率更加高效。 mapreduce的执行框架示意图。 spark执行框架示意图 spark的执行中间结果是存储在内存当中的&#xff0c;而hdfs的执行中间结果是存储在hdfs中的。所以在运算的时…

基于通义千问和向量数据构建问答知识库

参考&#xff1a;Java从0到1构建基于ChatGPT向量数据库的检索增强生成模型RAG-02 - 知乎 (zhihu.com) 1、先开通 阿里云的向量检索服务 如何开通向量检索服务并创建API-KEY_向量检索服务-阿里云帮助中心 (aliyun.com) 按流程申请 最后需要申请API-KEY 安装DashVector SDK M…

Nacos2.x配置中心源码分析

概述 源码注释参考 git 仓库&#xff0c;对应流程图后续补充&#xff1b; 启动 nacos nacos 启动类&#xff1a; // com.alibaba.nacos.NacosSpringBootApplication(scanBasePackages "com.alibaba.nacos") ServletComponentScan EnableScheduling public class…

关于安科瑞AAFD-40型故障电弧探测器的功能介绍-安科瑞 蒋静

1 概述 故障电弧探测器&#xff08;以下简称探测器&#xff09;对接入线路中的故障电弧&#xff08;包括故障并联电弧、故障串联电弧&#xff09;进行有效的检测&#xff0c;当检测到线路中存在引起火灾的故障电弧时&#xff0c;可以进行现场的声光报警&#xff0c;并将报警信…

单片机实验(三)

前言 实验一&#xff1a;利用定时器T1的中断控制P1.7引脚输出音频信号&#xff0c;启动蜂鸣器发出一段熟悉的与众不同的具有10个音节的音乐音频。 实验二&#xff1a;使用定时器/计数器来实现一个LCD显示年、月、日、星期 、时、分、秒的电子表&#xff0c;要求时和分可以方便…

Vmware17虚拟机安装windows10系统

不要去什么系统之家之类的下载镜像&#xff0c;会不好安装&#xff0c;镜像被魔改过了&#xff0c;适合真实物理机上的系统在PE里安装系统&#xff0c;建议下载原版系统ISO文件 安装vmware17pro 下载地址https://dwangshuo.jb51.net/202211/tools/VMwareplayer17_855676.rar 解…

04.PostgreSQL是如何实现隔离级别的?

PostgreSQL是如何实现隔离级别的&#xff1f; 事务有哪些特性&#xff1f; 事务看起来感觉简单&#xff0c;但是要实现事务必须要遵守 4 个特性&#xff0c;分别如下&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;一个事务中的所有操作&#xff0c;要么…

Elasticsearch(ES)概述

文章目录 一.什么是Elasticsearch?1.正向索引和倒排索引2.Mysql和ES的概念对比3.安装elasticsearch、kibana 二.IK分词器三.索引库操作四.文档操作五.RestClient操作索引库1.初始化RestClient2.创建索引库3.删除索引库4.判断索引库是否存在 六.RestClient操作文档1.新增文档2.…

Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

1、背景 集群配置为&#xff1a;8 个 node 节点&#xff0c;16 核 32G&#xff0c;索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高&#xff0c;search 没有慢查询的状态。 2、集群压测性能不能上去&#xff0c;cpu 使用未打…

Nat. Rev. Chem. | 一份关于用机器学习研究化学问题的评估指导

今天为大家介绍的是来自Tiago Rodrigues团队的一篇论文。机器学习&#xff08;ML&#xff09;有望解决化学领域的重大挑战。尽管ML工作流程的适用性极广&#xff0c;但人们通常发现评估研究设计多种多样。目前评估技术和指标的异质性导致难以&#xff08;或不可能&#xff09;比…

java设计模式学习之【单例模式】

文章目录 引言单例模式简介定义与用途实现方式&#xff1a;饿汉式懒汉式 UML 使用场景优势与劣势单例模式在spring中的应用饿汉式实现懒汉式实现数据库连接示例代码地址 引言 单例模式是一种常用的设计模式&#xff0c;用于确保在一个程序中一个类只有一个实例&#xff0c;并且…

计算机组成学习-数据的表示和运算总结

1、进制与编码 1.1 进位计数法 常用的进位计数法有十进制、二进制、八进制、十六进制等。十六进制每个 数位可取0〜9、A、B、C、D、E、F中的任意一个&#xff0c;其中A、B、C、D、E、F分别表示 10〜15。 八进制数字通常以前缀 "0"&#xff08;零&#xff09;加上数…

Ubuntu 2204 安装libimobiledevice

libimobiledevice是一个开源的软件&#xff0c;它可以直接使用系统原生协议和IOS设备进行通信&#xff0c;类似iMazing&#xff0c;iTunes&#xff0c;libimobiledevice不依赖IOS的私有库&#xff0c;并且连接IOS设备时用的都是原生协议&#xff0c;IOS无需越狱就能实现设备信息…

同旺科技 USB TO SPI / I2C --- 调试W5500_读写网关地址

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 这里的网关地址设置为192.168.1.1 先将网关地址写入寄存器&#xff0c;然后再读取出来&#xff1a;

Echarts 设备状态 甘特图

在做工厂智能化生产看板时&#xff0c;绝对会有设备状态看板&#xff0c;展示设备当天或者当前状态&#xff0c;设备状态数据一般是有mes 系统设备管理模块对设备信息进行采集&#xff0c;一般包括过站数据&#xff0c;设备当前状态&#xff0c;是否在线是否故障、检修、待生产…