不想沦为芸芸众生的人只需作一件事,即是对本身再也不散漫;他应当遵从良知的呼唤:“成为你本身!”编程
---尼采安全
一、整型
有符号整数类型:int八、int1六、int32和int64app
无符号整数类型:uint八、uint1六、uint32和uint64编程语言
跟CPU平台相关的数据类型:有符号整数int和无符号整数uint优化
特殊的无符号整数类型:uintptr(同指针),在32位平台下4字节,在64位平台下8字节ui
1.1 类型表示spa
int、uint和uintptr是不一样类型的兄弟类型,int和int32也不是相同的类型,编译器不会帮你自动作类型转换,须要强制类型转换。好比:指针
var apples int32 = 1code
var oranges int16 = 2blog
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.") }
二、浮点数
如何判断两个浮点数是否相等?浮点数不是一种精确地表达方式,因此像整型那样直接用 == 来判断两个浮点数是否相等是不可行的。应该采用下面的方法:
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") } }
三、布尔类型
布尔值能够和&&(AND)和||(OR)操做符结合,而且有短路行为:若是运算符左边值已经能够肯定整个布尔表达式的值,那么运算符右边的值将再也不被求值,所以下面的表达式老是安全的:
s != "" && s[0] == 'x'
其中s[0]操做若是应用于空字符串将会致使panic异常。
四、常量
常量表达式值在编译时期计算,而不是在运行时期。
全部常量的运算均可以在编译期完成,这样能够减小运行时的工做,也方便其余编译优化。当操做数是常量时,一些运行时的错误也能够在编译时被发现,例如整数除零、字符串索引越界、任何致使无效浮点数的操做等。
4.1 iota常量生成器
常量声明可使用iota常量生成器初始化,它用于生成一组以类似规则初始化的常量,可是不用每行都写一遍初始化表达式。在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,而后在每个有常量声明的行加一。
下面是来自time包的例子,它首先定义了一个Weekday命名类型,而后为一周的天天定义了一个常量,从周日0开始。在其它编程语言中,这种类型通常被称为枚举类型。
type Weekday int const ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturday )
五、字符串
在Go语言中,字符串也是一种基本类型。
字符串链接:x + y; "Hello" + "123",结果为"Hello123"
字符串长度:len(s)