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

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

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

被广泛使用的整型

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

全部留言(33)

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

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

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

    作者回复: 👍

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

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

    25
  • 羊羊
    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

    11
  • 在下宝龙、
    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

    7
  • 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)) } 变量的二进制表示一样,所以相同了

    作者回复: 👍

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

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

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

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

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

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

    4
  • 顾海
    白老师,github地址是什么

    作者回复: 你是指本专栏的对应的示例代码仓库么?专栏的普通章节 示例代码都很短,没有放到代码仓库中。对于实战小项目,仓库地址在https://github.com/bigwhite/publication/tree/master/column/timegeek/go-first-course。 我个人github是:https://github.com/bigwhite 不知道是否回答了你的问题:)。

    3
收起评论
显示
设置
留言
33
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部