Go数据类型之基本数据类型
不想沦为芸芸众生的人只需做一件事,便是对自己不再散漫;他应当听从良知的呼唤:“成为你自己!”
---尼采
1、整型
有符号整数类型:int8、int16、int32和int64
无符号整数类型:uint8、uint16、uint32和uint64
跟CPU平台相关的数据类型:有符号整数int和无符号整数uint
特殊的无符号整数类型:uintptr(同指针),在32位平台下4字节,在64位平台下8字节
1.1 类型表示
int、uint和uintptr是不同类型的兄弟类型,int和int32也不是相同的类型,编译器不会帮你自动做类型转换,需要强制类型转换。比如:
var apples int32 = 1
var oranges int16 = 2
var compote int = apples + oranges //compile error
当编译时,会产生一个错误信息:
invalid operation: apples + oranges (mismatched types int32 and int16)
解决方法是将他们都显式转型为一个常见类型:
var compote = int(apples) + int(oranges)
1.2 比较运算
两个不同类型的整数型不能直接比较,但各种类型的整型变量都可以直接与字面常量进行比较。
var i int32
var j int64
i, j = 1, 2
if i == j { //编译错误
fmt.Println("i and j are equal.")
}
if i == 1 || j == 2 { //编译通过
fmt.Println("i and j are equal.")
}
2、浮点数
如何判断两个浮点数是否相等?浮点数不是一种精确地表达方式,所以像整型那样直接用 == 来判断两个浮点数是否相等是不可行的。应该采用下面的方法:
package main
import (
"fmt"
"math"
)
const MIN = 0.000001
// MIN 为用户自定义的比较精度
func IsEqual(f1, f2 float64) bool {
return math.Dim(f1, f2) < MIN
}
func main() {
a := 0.0000123
b := 0.000012234
if IsEqual(a, b) {
fmt.Println("a < b")
}
}
3、布尔类型
布尔值可以和&&(AND)和||(OR)操作符结合,并且有短路行为:如果运算符左边值已经可以确定整个布尔表达式的值,那么运算符右边的值将不再被求值,因此下面的表达式总是安全的:
s != "" && s[0] == 'x'
其中s[0]操作如果应用于空字符串将会导致panic异常。
4、常量
常量表达式值在编译时期计算,而不是在运行时期。
所有常量的运算都可以在编译期完成,这样可以减少运行时的工作,也方便其他编译优化。当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。
4.1 iota常量生成器
常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一。
下面是来自time包的例子,它首先定义了一个Weekday命名类型,然后为一周的每天定义了一个常量,从周日0开始。在其它编程语言中,这种类型一般被称为枚举类型。
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
5、字符串
在Go语言中,字符串也是一种基本类型。
字符串连接:x + y; "Hello" + "123",结果为"Hello123"
字符串长度:len(s)