Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

12|基本数据类型:Go原生支持的数值类型有哪些?

uintptr
uint
int
uint64
uint32
uint16
uint8
int64
int32
int16
int8
类型别名语法
类型定义语法
复数类型的字面值
complex128
complex64
字面值与格式化输出
浮点型的二进制表示
float64
float32
IEEE 754标准
整型溢出问题
平台相关整型
平台无关整型
思考题
自定义数值类型
复数型
浮点型
整型
基本数据类型

该思维导图由 AI 生成,仅供参考

你好,我是 Tony Bai。
在上一课中,我们学习了 Go 变量的声明形式,知道了变量所绑定的内存区域应该有明确的边界,而这个边界信息呢,是由变量的类型赋予的。那么,顺着这个脉络,从这一节课开始,我们就来深入讲解 Go 语言类型。
你可能会有点不解,类型是每个语言都有的东西,我们有必要花那么多时长、讲那么详细吗?
有必要。对像 Go 这样的静态编程语言来说,类型是十分重要的。因为它不仅是静态语言编译器的要求,更是我们对现实事物进行抽象的基础。对这一方面的学习,可以让你逐渐建立起代码设计的意识。
Go 语言的类型大体可分为基本数据类型、复合数据类型和接口类型这三种。其中,我们日常 Go 编码中使用最多的就是基本数据类型,而基本数据类型中使用占比最大的又是数值类型。
那么,我们今天就先来讲数字类型。Go 语言原生支持的数值类型包括整型、浮点型以及复数类型,它们适用于不同的场景。我们依次来看一下。

被广泛使用的整型

Go 语言的整型,主要用来表示现实世界中整型数量,比如:人的年龄、班级人数等。它可以分为平台无关整型平台相关整型这两种,它们的区别主要就在,这些整数类型在不同 CPU 架构或操作系统下面,它们的长度是否是一致的。
我们先来看平台无关整型,它们在任何 CPU 架构或任何操作系统下面,长度都是固定不变的。我在下面这张表中总结了 Go 提供的平台无关整型:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go语言浮点类型采用IEEE 754标准,包括单精度和双精度两种浮点数格式。Go提供了float32和float64两种浮点类型,分别对应IEEE 754中的单精度和双精度浮点数值类型。浮点数的二进制表示包括符号位、阶码和尾数,阶码和尾数的长度决定了浮点类型可以表示的浮点数范围与精度。双精度浮点类型(float64)在日常开发中更常使用,也是Go语言中浮点常量或字面值的默认类型。浮点类型的学习有助于建立应用浮点类型的理论基础,同时需要注意浮点数精度不足可能导致输出结果与常识不符的情况。 浮点类型的字面值可分为直接十进制表示和科学计数法形式。fmt包提供了针对浮点数的格式化输出,包括%f输出浮点数原值形式,%e输出十进制的科学计数法形式,%x输出十六进制的科学计数法形式。Go语言原生支持复数类型,提供complex64和complex128两种复数类型,用于专业领域的计算。复数类型的格式化输出可直接运用浮点型的格式化输出方法。 此外,文章还介绍了如何通过类型定义语法与类型别名语法创建自定义数值类型。通过类型定义语法实现的自定义数值类型与原类型是完全不同的类型,需要借助显式转型来避免编译错误。而通过类型别名创建的新类型则等价于原类型,可以互相替代。 总之,本文介绍了Go语言的浮点类型、复数类型以及如何创建自定义数值类型,为读者提供了对Go语言数值类型的全面了解和应用基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 罗杰
    float 其实相当复杂,开发中如果能避开就避开,例如金钱单位只有美元或者人民币我建议以分作为单位。

    作者回复: 嗯,是这样的。

    2021-11-08
    6
    58
  • liaomars
    var f1 float32 = 16777216.0 var f2 float32 = 16777217.0 f1 == f2 // true f1 转换成二进制是:1266679808 f2 转换成二进制也是:1266679808 这个为什么是相等的,是因为转换成二进制的数据是相等的。

    作者回复: 👍

    2021-11-09
    2
    38
  • jc9090kkk
    type Myint int32 这种自定义类型在实际应用中有什么优势吗?

    作者回复: 采用自定义类型时,我们考虑的角度不是优劣,而是需求。以type Myint int32为例,我们这么做,显然是因为int32不能满足我们的需求。哪些需求不能满足呢?第一个就是抽象,我们要建立更高级的抽象;第二个是我们不能为go原生类型int32增加我们想要的方法,只有通过自定义类型来实现。

    2021-11-10
    29
  • 羊羊
    0x1.Fp+0 // 1.9375 * 2^0 = 1.937500这个是如何计算得到的?0x1.F=1.9375是如何得到的?

    作者回复: 0x1.Fp+0中的F是十六进制数,它的十进制值为15。F在小数点后一位,因此上面数字的小数部分0.F转换为10进制小数就是15 x 16^(-1)=0.9375

    2021-11-08
    15
  • 在下宝龙、
    type Myint int type MyMapp map[string]int func main(){ var x Myint var y int x=y//会报错 mp1:=make(MyMapp) mp2:=make(map[string]int) mp1=mp2 //不会报错 } 老师为甚么map就不会报错

    作者回复: int与map[string]int虽然都是go原生类型,但它们却有不同。int在go中被归为defined type一类,而map[string]int则不是defined type。因此两个defined type: int与MyInt相互赋值必须显式转型。而map[string]int与MyMapp中,前者不是defined type,go语言有规定:这种情况下,可以直接赋值。具体参考这里:https://golang.google.cn/ref/spec#Assignability

    2021-11-29
    8
  • func main() { var f2 float32 = 16777216.0 var f3 float32 = 16777217.0 // 1001011100000000000000000000000 fmt.Printf("%b\n", math.Float32bits(f2)) // 1001011100000000000000000000000 fmt.Printf("%b\n", math.Float32bits(f3)) } 变量的二进制表示一样,所以相同了

    作者回复: 👍

    2022-01-28
    7
  • 运维夜谈
    老师,自定义类型和类型别名有什么样的应用场景?比如自定义一个类型,本质还是int32,那为啥不直接用int32,看起来感觉有点语法糖的意思,用处不大,特别是类型别名😢

    作者回复: 原生的int32不能有方法,但自定义类型可以有方法哦。比如我定义一个名为Age的类型:type Age int32。Age可以作为“年龄”的抽象。我们可以为Age定义方法。至于类型别名,更多用于重构代码或基于已有包的二次封装。

    2021-12-29
    2
    5
  • ryanxw
    工程开发中尽量不用浮点,像我们都要求用string来存价格

    作者回复: 浮点用起来的确坑挺多。当然这也和其他实现原理有关。

    2022-04-15
    4
  • Kepler
    因为两个浮点数的差异在尾数M的第24位,超了

    作者回复: ✅

    2022-03-06
    4
  • tequ1lAneio
    老师好,类型别名具体会在哪些场景用得到呢?

    作者回复: 类型别名加入go的初衷就是为了重构,这也是其主要场景。在第17讲中还会有提及。

    2021-11-09
    4
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部