2.2常量232.2.2常量定义通过const关键字,你可以给字面常量指定一个友好的名字:const Pif1oat64=3.14159265358979323846const zero = 0.0//无类型浮点常量const(2size int64=1024eof = -1//无类型整型常量)//u=0.0,V=3.0,常量的多重赋值const u,v float32=0,3const a,b,c =3,4,"foo"//a=3,b=4,c="foo",无类型整型和字符串常量Go的常量定义可以限定常量类型,但不是必需的。如果定义常量时没有指定类型,那么它与字面常量一样,是无类型常量。常量定义的右值也可以是一个在编译期运算的常量表达式,比如const mask =1 << 3由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式,比如试图以如下方式定义常量就会导致编译错误:const Home =os.GetEnv("HOME")原因很简单,os.GetEnv()只有在运行期才能知道返回结果,在编译期并不能确定,所以无法作为常量定义的右值。2.2.3预定义常量Go语言预定义了这些常量:true、false和iota。iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被重置为o,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。从以下的例子可以基本理解iota的用法://iota被重设为0const(co = iota11cO==0// c1== 1ci = iotac2 =1ota// c2==2)const(a = l << iota//a==1(iota在每个const开头被重设为0)b = 1 << iotaIlb=21/C--4c = 1 << iota)const(u=iota * 42//u==0V.float64=iota*42//V==42.0图灵社区会员soooldier(soooldier@live.com)专享尊重版权
2.2 常量 23 1 2 3 4 5 9 6 7 8 2.2.2 常量定义 通过const关键字,你可以给字面常量指定一个友好的名字: const Pi float64 = 3.14159265358979323846 const zero = 0.0 // 无类型浮点常量 const ( size int64 = 1024 eof = -1 // 无类型整型常量 ) const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值 const a, b, c = 3, 4, "foo" // a = 3, b = 4, c = "foo", 无类型整型和字符串常量 Go的常量定义可以限定常量类型,但不是必需的。如果定义常量时没有指定类型,那么它 与字面常量一样,是无类型常量。 常量定义的右值也可以是一个在编译期运算的常量表达式,比如 const mask = 1 << 3 由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达 式,比如试图以如下方式定义常量就会导致编译错误: const Home = os.GetEnv("HOME") 原因很简单,os.GetEnv()只有在运行期才能知道返回结果,在编译期并不能确定,所以 无法作为常量定义的右值。 2.2.3 预定义常量 Go语言预定义了这些常量:true、false和iota。 iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被 重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。 从以下的例子可以基本理解iota的用法: const ( // iota被重设为0 c0 = iota // c0 == 0 c1 = iota // c1 == 1 c2 = iota // c2 == 2 ) const ( a = 1 << iota // a == 1 (iota在每个const开头被重设为0) b = 1 << iota // b == 2 c = 1 << iota // c == 4 ) const ( u = iota * 42 // u == 0 v float64 = iota * 42 // v == 42.0 图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权
24第2章顺序编程w= iota *42//w==841//x==0(因为iota又被重设为0了)const x = iotaconst y=iota//==0(同上)如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式。因此,上面的前两个const语句可简写为://iota被重设为0const(co = iota//c==0c1// cl==1c2/ / c2 == 2)const(a= 1 <<iota//a==1(iota在每个const开头被重设为o)b//b==2c//C4)2.2.4枚举枚举指一系列相关的常量,比如下面关于一个星期中每天的定义。通过上一节的例子,我们看到可以用在const后跟一对圆括号的方式定义一组常量,这种定义法在Go语言中通常用于定义枚举值。Go语言并不支持众多其他语言明确支持的enum关键字。下面是一个常规的枚举表示法,其中定义了一系列整型常量:const (Sunday=iotaMondayTuesdayWednesdayThursdayFridaySaturday//这个常量没有导出numberOfDays)同Go语言的其他符号(sVmbol)一样,以大写字母开头的常量在包外可见。以上例子中numberofDays为包内私有,其他符号则可被其他包访问。类型2.3Go语言内置以下这些基础类型:口布尔类型:bool。整型:int8、byte、int16、int、uint、uintptr等。口浮点类型:f1oat32、f1oat64。图灵社区会员soooldier(soooldier@live.com)专享尊重版权
24 第 2 章 顺序编程 w = iota * 42 // w == 84 ) const x = iota // x == 0 (因为iota又被重设为0了) const y = iota // y == 0 (同上) 如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式。因此,上 面的前两个const语句可简写为: const ( // iota被重设为0 c0 = iota // c0 == 0 c1 // c1 == 1 c2 // c2 == 2 ) const ( a = 1 <<iota // a == 1 (iota在每个const开头被重设为0) b // b == 2 c // c == 4 ) 2.2.4 枚举 枚举指一系列相关的常量,比如下面关于一个星期中每天的定义。通过上一节的例子,我们 看到可以用在const后跟一对圆括号的方式定义一组常量,这种定义法在Go语言中通常用于定义 枚举值。Go语言并不支持众多其他语言明确支持的enum关键字。 下面是一个常规的枚举表示法,其中定义了一系列整型常量: const ( Sunday = iota Monday Tuesday Wednesday Thursday Friday Saturday numberOfDays // 这个常量没有导出 ) 同Go语言的其他符号(symbol)一样,以大写字母开头的常量在包外可见。 以上例子中numberOfDays为包内私有,其他符号则可被其他包访问。 2.3 类型 Go语言内置以下这些基础类型: 布尔类型:bool。 整型:int8、byte、int16、int、uint、uintptr等。 浮点类型:float32、float64。 图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权
2.3类型25口复数类型:complex64、complex128。口字符串:string。口字符类型:rune。口错误类型:error。此外,Go语言也支持以下这些复合类型:2口指针(pointer)口数组(array)口切片(slice)口字典(map)口通道(chan)口结构体(struct)口接口(interface)关于错误类型,我们会在“错误处理”一节中介绍;关于通道,我们会在4.5节中进一步介绍;关于结构体和接口,我们则在第3章中进行详细的阐述。在这些基础类型之上Go还封装了下面这几种类型:int、uint和uintptr等。这些类型的特点在于使用方便,但使用者不能对这些类型的长度做任何假设。对于常规的开发来说,用int和uint就可以了,没必要用int8之类明确指定长度的类型,以免导致移植困难。2.3.1布尔类型Go语言中的布尔类型与其他语言基本一致,关键字也为bool,可赋值为预定义的true和false示例代码如下:var vl boolvl - truev2:=(1==2)//v2也会被推导为boo1类型布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。以下的示例是一些错误的用法,会导致编译错误:varb boolb=1/ /编译错误b=bool(1)1/编译错误以下的用法才是正确的:var b boolb=(1!=0)//编译正确fmt.Println("Result:",b)//打印结果为Result:true整型2.3.2整型是所有编程语言里最基础的数据类型。Go语言支持表2-1所示的这些整型类型。图灵社区会员soooldier(soooldier@live.com)专享尊重版权
2.3 类型 25 1 2 3 4 5 9 6 7 8 复数类型:complex64、complex128。 字符串:string。 字符类型:rune。 错误类型:error。 此外,Go语言也支持以下这些复合类型: 指针(pointer) 数组(array) 切片(slice) 字典(map) 通道(chan) 结构体(struct) 接口(interface) 关于错误类型,我们会在“错误处理”一节中介绍;关于通道,我们会在4.5节中进一步介 绍;关于结构体和接口,我们则在第3章中进行详细的阐述。 在这些基础类型之上Go还封装了下面这几种类型:int、uint和uintptr等。这些类型的 特点在于使用方便,但使用者不能对这些类型的长度做任何假设。对于常规的开发来说,用int 和uint就可以了,没必要用int8之类明确指定长度的类型,以免导致移植困难。 2.3.1 布尔类型 Go语言中的布尔类型与其他语言基本一致,关键字也为bool,可赋值为预定义的true和 false示例代码如下: var v1 bool v1 = true v2 := (1 == 2) // v2也会被推导为bool类型 布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。以下的示例是一些错误 的用法,会导致编译错误: var b bool b = 1 // 编译错误 b = bool(1) // 编译错误 以下的用法才是正确的: var b bool b = (1!=0) // 编译正确 fmt.Println("Result:", b) // 打印结果为Result: true 2.3.2 整型 整型是所有编程语言里最基础的数据类型。Go语言支持表2-1所示的这些整型类型。 图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权
第2章顺序编程26表 2-1类型值范围长度(字节)1int8128~1271uint8(即byte)0~2552int1632768~327672uint160~655354int322147483648~21474836474uint320~42949672958int649223372036854775808~92233720368547758078uint640~18446744073709551615int平台相关平台相关平台相关平台相关uint同指针在32位平台下为4字节,64位平台下为8字节uintptr1.类型表示需要注意的是,int和int32在Go语言里被认为是两种不同的类型,编译器也不会帮你自动做类型转换,比如以下的例子会有编译错误:var value2 int32valuel := 64//value1将会被自动推导为int类型value2=valuel//编译错误编译错误类似于:cannot use valuel (type int) as type int32 in assignment.使用强制类型转换可以解决这个编译错误:value2=int32(value1)//编译通过当然,开发者在做强制类型转换时,需要注意数据长度被截短而发生的数据精度损失(比如将浮点数强制转为整数)和值溢出(值超过转换的目标类型的值范围时)问题。2.数值运算Go语言支持下面的常规整数运算:+、一、*、/和%。加减乘除就不详细解释了,需要说下的是,%和在C语言中一样是求余运算,比如:5%3//结果为:23.比较运算Go语言支持以下的几种比较运算符:>、<、==、>=、<=和!=。这一点与大多数其他语言相同,与C语言完全一致。下面为条件判断语句的例子:i,j=1,2ifi-jtfmt.Println("i and jare equal.")力图灵社区会员soooldier(soooldier@live.com)专享尊重版权
26 第 2 章 顺序编程 表 2-1 类 型 长度(字节) 值 范 围 int8 1 128 ~ 127 uint8(即byte) 1 0 ~ 255 int16 2 32 768 ~ 32 767 uint16 2 0 ~ 65 535 int32 4 2 147 483 648 ~ 2 147 483 647 uint32 4 0 ~ 4 294 967 295 int64 8 9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 uint64 8 0 ~ 18 446 744 073 709 551 615 int 平台相关 平台相关 uint 平台相关 平台相关 uintptr 同指针 在32位平台下为4字节,64位平台下为8字节 1. 类型表示 需要注意的是,int和int32在Go语言里被认为是两种不同的类型,编译器也不会帮你自动 做类型转换,比如以下的例子会有编译错误: var value2 int32 value1 := 64 // value1将会被自动推导为int类型 value2 = value1 // 编译错误 编译错误类似于: cannot use value1 (type int) as type int32 in assignment。 使用强制类型转换可以解决这个编译错误: value2 = int32(value1) // 编译通过 当然,开发者在做强制类型转换时,需要注意数据长度被截短而发生的数据精度损失(比如 将浮点数强制转为整数)和值溢出(值超过转换的目标类型的值范围时)问题。 2. 数值运算 Go语言支持下面的常规整数运算:+、、*、/和%。加减乘除就不详细解释了,需要说下的 是,% 和在C语言中一样是求余运算,比如: 5 % 3 // 结果为:2 3. 比较运算 Go语言支持以下的几种比较运算符:>、<、==、>=、<=和!=。这一点与大多数其他语言相 同,与C语言完全一致。 下面为条件判断语句的例子: i, j := 1, 2 if i == j { fmt.Println("i and j are equal.") } 图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权
2.3类型27两个不同类型的整型数不能直接比较,比如int8类型的数和int类型的数不能直接比较,但各种类型的整型变量都可以直接与字面常量(literal)进行比较,比如:var i int32var j int64i,j=1.22//编译错误ifi--jfmt.printin("i and j are equal.")1ifi==1j=-2(//编译通过fmt.Println("i and j are equal.")4.位运算Go语言支持表2-2所示的位运算符。表2-2算含义样例运左移124 <<2I/结果为496X<<y右移II结果为31124>>2X >> y异或124~2x^y结果为126与11结果为0124&2x&y或12412结果为126xIynx取反^2II结果为-3Go语言的大多数位运算符与C语言都比较类似,除了取反在C语言中是~x,而在Go语言中是^X。2.3.3浮点型浮点型用于表示包含小数点的数据,比如1.234就是一个浮点型数据。Go语言中的浮点类型采用IEEE-754标准的表达方式。1.浮点数表示Go语言定义了两个类型float32和f1oat64,其中f1oat32等价于C语言的f1oat类型,float64等价于c语言的double类型。在Go语言里,定义一个浮点数变量的代码如下:var fvaluel float32fvalue1 =12fvalue2=12.0//如果不加小数点,fvalue2会被推导为整型而不是浮点型图灵社区会员soooldier(soooldier@live.com)专享尊重版权
2.3 类型 27 1 2 3 4 5 9 6 7 8 两个不同类型的整型数不能直接比较,比如int8类型的数和int类型的数不能直接比较,但 各种类型的整型变量都可以直接与字面常量(literal)进行比较,比如: 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.") } 4. 位运算 Go语言支持表2-2所示的位运算符。 表 2-2 运 算 含 义 样 例 x << y 左移 124 << 2 // 结果为496 x >> y 右移 124 >> 2 // 结果为31 x ^ y 异或 124 ^ 2 // 结果为126 x & y 与 124 & 2 // 结果为0 x | y 或 124 | 2 // 结果为126 ^x 取反 ^2 // 结果为3 Go语言的大多数位运算符与C语言都比较类似,除了取反在C语言中是~x,而在Go语言中 是^x。 2.3.3 浮点型 浮点型用于表示包含小数点的数据,比如1.234就是一个浮点型数据。Go语言中的浮点类型 采用IEEE-754标准的表达方式。 1. 浮点数表示 Go语言定义了两个类型float32和float64,其中float32等价于C语言的float类型, float64等价于C语言的double类型。 在Go语言里,定义一个浮点数变量的代码如下: var fvalue1 float32 fvalue1 = 12 fvalue2 := 12.0 // 如果不加小数点,fvalue2会被推导为整型而不是浮点型 图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权