Golang数据类型(数字型)

news2024/11/20 3:30:13

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, 2
	fmt.Println(a + b)
	fmt.Println(a - b)
	fmt.Println(a * b)
	fmt.Println(a / b)
}

 

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

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

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

 

 

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

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

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

 

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

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

func main() {
	a := 10
	fmt.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 = 16777216
	fmt.Println(f1 == f1+1)
	var f2 float64 = 16777216
	fmt.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 := 100
	fmt.Println(string(num))
}
输出:

 

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

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

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

func main() {
	num := 100
	fmt.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.coloradmin.cn/o/1275710.html

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

相关文章

2021年11月10日 Go生态洞察:Twelve Years of Go

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Python作用域大揭秘:局部、全局,global关键字

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python作用域是编程中关键的概念之一&#xff0c;决定了变量在代码中的可见性和生命周期。本文将深入探讨Python的局部作用域、全局作用域&#xff0c;以及如何使用global关键字来操作全局变量。通过丰富的示例代…

Jmeter测试地图服务性能

一、前言 Jmeter可以用来模拟多用户来访问http&#xff08;s&#xff09;请求&#xff0c;并返回访问结果&#xff0c;而地图服务归根结底仍是个http&#xff08;s&#xff09;请求。所以我们可以使用Jmeter对地图服务进行压力测试。 当然地图服务也有着它的特殊性&#xff0…

AES加密技术:原理与应用

一、引言 随着信息技术的飞速发展&#xff0c;数据安全已成为越来越受到重视的领域。加密技术作为保障数据安全的重要手段&#xff0c;在信息安全领域发挥着举足轻重的作用。AES&#xff08;Advanced Encryption Standard&#xff09;作为一种对称加密算法&#xff0c;自1990年…

算法题--排椅子(贪心)

题目链接 code #include<bits/stdc.h> using namespace std;struct node{int indx;//用来存储数组下标int cnt;//用来计数 };bool cmp(node a,node b){ //判断是否是数字最大的一个就是经过最多谈话人的道return a.cnt>b.cnt; } node row[2010],cow[2010];bool cmp…

C++12.1

三种运算符重载&#xff0c;每个至少实现一个运算符的重载 #include <iostream>using namespace std;class Person {friend const Person operator- (const Person &L, const Person &R);friend bool operator<(const Person &L,const Person &R);f…

TZOJ 1420 手机短号

答案&#xff1a; #include <stdio.h> #include <string.h> int main() {int n 0;scanf("%d", &n);while (n--) //输入n次{char phone[12];scanf("%s", phone);printf("6%s\n", phone 6); //跳过数组前6个元素&#…

数据挖掘实战:基于 Python 的个人信贷违约预测

本次分享我们 Python 觅圈的一个练手实战项目&#xff1a;个人信贷违约预测&#xff0c;此项目对于想要学习信贷风控模型的同学非常有帮助。 技术交流 技术要学会交流、分享&#xff0c;不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。 好的文章离不开粉丝的分享、…

win10 修改任务栏颜色 “开始菜单、任务栏和操作中心” 是灰色无法点击,一共就两步,彻底解决有图有真相。

电脑恢复了一下出厂设置、然后任务栏修改要修改一下颜色&#xff0c;之前会后来忘记了&#xff0c;擦。 查了半天文档没用&#xff0c;最后找到官网才算是看到问题解决办法。 问题现象: 解决办法: 往上滑、找到这里 浅色改成深色、然后就可以了&#xff0c;就这么简单。 w…

美丽的时钟

案例绘制一个时钟 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>美丽的时钟</title><script language"javascript">window.onloadfunction(){var clockdocument.getElementById("clock"…

Ubuntu中MySQL安装与使用

一、安装教程&#xff1a;移步 二、通过sql文件创建表格&#xff1a; 首先进入mysql&#xff1a; mysql -u 用户 -p 回车 然后输入密码source sql文件&#xff08;路径&#xff09;;上面是sql语句哈&#xff0c;所以记得加分号。 sql文件部分截图&#xff1a; 创建成功后的部…

【小布_ORACLE笔记】Part11-1--RMAN Backups

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…

【无标题】mmocr在云服务器上

这里写目录标题 1、创建虚拟环境2、切换和退出conda虚拟环境3. 显示、复制&#xff08;克隆&#xff09;、删除虚拟环境4、删除环境安装指示中 cd进项目文件夹开始训练模型&#xff08;python XXX.py | tee record.txt 记录训练结果&#xff09;如何在Linux服务器上安装Anacond…

Redis部署-主从模式

目录 单点问题 主从模式 解析主从模式 配置redis主从模式 info replication命令查看复制相关的状态 断开复制关系 安全性 只读 传输延迟 拓扑结构 数据同步psync replicationid offset psync运行流程 全量复制流程 无硬盘模式 部分复制流程 积压缓冲区 实时复…

【代码】基于算术优化算法(AOA)优化参数的随机森林(RF)六分类机器学习预测算法/matlab代码

代码名称&#xff1a;基于算术优化算法&#xff08;AOA&#xff09;优化参数的随机森林&#xff08;RF&#xff09;六分类机器学习预测算法/matlab代码 使用算术优化算法&#xff08;AOA&#xff09;优化分类预测模型的参数&#xff0c;收敛性好&#xff0c;准确率提升明显&am…

【Java】I/O流—File类:从0到1的全面解析

&#x1f38a;专栏【Java】 &#x1f33a;每日一句:看不清楚未来时,就比别人坚持久一点 ⭐欢迎并且感谢大家指出我的问题 目录 1.File概述 2.File构造方法 (1).根据文件路径创建文件对象 (2).根据父路径名字符串和子路径名字符串创建对象 (3).根据父路径对应文件对象和子路…

Linux学习第46天:Linux音频驱动试验:总有那么一首歌,会让你泪流满面。

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 大叔来之一个小村庄&#xff0c;上大学以后来到了省城济南。之前高中练习英语听力买过一个随声听&#xff0c;晚上练习听力&#xff0c;怕影响同学休息还买了一个…

超级鹰验证码平台使用 + 案例使用

超级鹰主要是用来识别图片形式的验证码&#xff0c;进行登录验证的。 使用流程&#xff1a; 注册账号领取1000题分&#xff0c;新用户可以享受1000题分的优惠。 进去页面之后&#xff0c;点击开发文档&#xff1a; 这里面有很多语言的使用&#xff0c;这篇博客介绍python的…

Linux中top命令输出日志分析?

以下是对输出的各部分的解释&#xff1a; 09:54:34&#xff1a;系统当前时间。up 161 days, 2:08&#xff1a;系统已经运行了161天2小时8分钟。5 users&#xff1a;有5个用户登录系统。load average: 0.13, 0.08, 0.05&#xff1a;系统的1分钟、5分钟、15分钟的平均负载。负载…

Halcon算子中的slant倾斜hom_mat2d_slant

1.hom_mat2d_slant(HomMat2DIdentity, rad(50), y, 0, 0, HomMat2DSlant) --这个是选择20度和50度的。&#xff08;0&#xff0c; 0&#xff09;点对应的是左上角&#xff0c;50度就是让y轴产生有50度的倾角。 2.hom_mat2d_slant(HomMat2DIdentity, rad(60), x, 0, 0, HomMat2D…