原创文章,若需转载请注明出处!
欢迎扫码关注公众号「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还有另外两种整数类型:byte
和rune
,它们分别是uint8
和int32
的别名:
在Go中,没有char
字符类型,byte
和rune
用于强调字符而不是整型值。
byte
用来表示ASCII
字符,rune
表示以UTF-8格式编码的Unicode码点。
字符在Go中怎么表示呢?用单引号括起来,例如:'A'
字符默认的类型是rune
,所以,如果在声明一个字符变量时没有指明类型,Go编译器会默认是rune
:
var myByte = 'A'
fmt.Printf("%T\n",myByte)
输出:int32,rune
是int32
的别名嘛,所以输出int32
。
那我们就直接使用byte
指明变量的类型:
var lastLetter byte = 'Z'
byte
和rune
实质上都是整数,例如,byte
类型的'A'
可以转成整型值97;类似的,rune
类型的Unicode字符'♥'
可以转成对应的Unicode码点U+2665
(U+
用来表示unicode
,2665
是十六进制数值),实质上也是整型。
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有两种浮点数float32
和float64
。
float32
,32位,单精度;float64
,64位,双精度;
默认的浮点型是float64
,所以,但你初始化一个浮点型的变量而没有指明是哪种浮点类型时,编译器默认是float64
。
var a = 9715.635 //默认float64
类型转化
Go的类型系统非常强大,不允许你在表达式中将数字类型混淆。例如,不允许int
和float64
类型执行相加操作,甚至连int
和int64
之间也不能:
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来了」,获取最新精彩文章!