数字类型--就要学习Go系列

原创文章,若需转载请注明出处!
欢迎扫码关注公众号「Golang来了」或者移步 www.seekload.net,查看更多精彩文章。

前言

数字类型当然是用来表示数字的,分为整型和浮点型。

整型

整型用来存储整数,Go有几种不同大小的内置整数类型,用于存储有符号和无符号整数。

有符号整型

有符号整型
int类型的大小取决于机器,在32位机器上是32 bits,在64位机器上则是64 bits。

无符号整型

无符号整型
uint的大小也取决于机器。

使用整数值时,除非有充分的理由必须使用符合大小的无符号整数类型,否则应始终使用int数据类型。

举个?:

medals := []string{"gold", "silver", "bronze"}
for i := len(medals) - 1; i >= 0; i-- {
    fmt.Println(medals[i]) // "bronze", "silver", "gold"
}

程序的意思一眼就能看懂:循环输出数组的元素。
看下,程序有没有问题?如果len函数返回一个无符号数,那么i也将是无符号的uint类型,然后条件i >= 0则永远为真。在三次迭代之后,也就是i == 0时,i--语句将不会产生-1,而是变成一个uint类型的最大值(可能是 2 64 2^{64} 264 - 1),然后medals[i]表达式运行时将发生访问异常。

var myInt8 int8 = 97

// 变量不声明类型,系统默认 int类型
var myInt = 1200

var myUint uint = 500

var myHexNumber = 0xFF  // '0x' or '0X' 前缀 表示16进制数
var myOctalNumber = 034 //  '0' 前缀表示8进制数

fmt.Printf("%T\n",myInt)   // %T 输出变量类型
fmt.Printf("%d, %d, %d, %#x, %#o\n", myInt8, myInt, myUint, myHexNumber, myOctalNumber)
// %后的 # 副词告诉Printf在用%o、%x或%X输出时生成0、0x或0X前缀。

输出:

还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。uintptr类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方,我们以后再讲它的用法。

整型别名

Golang还有另外两种整数类型:byterune,它们分别是uint8int32的别名:

在Go中,没有char字符类型,byterune用于强调字符而不是整型值。
byte用来表示ASCII字符,rune表示以UTF-8格式编码的Unicode码点。
字符在Go中怎么表示呢?用单引号括起来,例如:'A'
字符默认的类型是rune,所以,如果在声明一个字符变量时没有指明类型,Go编译器会默认是rune:

var myByte = 'A'
fmt.Printf("%T\n",myByte)

输出:int32,runeint32的别名嘛,所以输出int32
那我们就直接使用byte指明变量的类型:

var lastLetter byte = 'Z'

byterune实质上都是整数,例如,byte类型的'A'可以转成整型值97;类似的,rune类型的Unicode字符'♥'可以转成对应的Unicode码点U+2665U+用来表示unicode2665是十六进制数值),实质上也是整型。

var myByte byte = 'a'
var myRune rune = '♥'
fmt.Printf("%c = %d and %c = %U\n", myByte, myByte, myRune, myRune)

输出:a = 97 and ♥ = U+2665
上面的例子中,输出的是byte变量myByte和对应的十进制数字、rune变量myRune和对应的Unicode码。

浮点数

浮点数用户存储带小数点的数字,Go有两种浮点数float32float64

  • float32,32位,单精度;
  • float64,64位,双精度;

默认的浮点型是float64,所以,但你初始化一个浮点型的变量而没有指明是哪种浮点类型时,编译器默认是float64

 var a = 9715.635      //默认float64

类型转化

Go的类型系统非常强大,不允许你在表达式中将数字类型混淆。例如,不允许intfloat64类型执行相加操作,甚至连intint64之间也不能:

var a int64 = 4
var b int = a  // 编译出错 (Cannot use a (type in64) as type int in assignment)

var c int = 500
var result = a + c // 编译出错 (Invalid Operation: mismatched types int64 and int)

与其他静态类型语言(如C,C ++和Java)不同,Go是不提供任何隐式类型转换的。好了,如果你非要在不同类型的数字之间执行类似相加、相减等操作,怎么办?类型转换,转换成你需要的类型,语法是这样的:
T(v)T就是目标类型,v是想转的值:

var a int64 = 4
var b int = int(a)  // 显式类型转换

var c float64 = 6.5
// 显式类型转换
var result = float64(b) + c  		// Works

输出:10.5

(全文完)

扫描上方二维码,欢迎关注公众号「Golang来了」,获取最新精彩文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seekload

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值