3. 类型 Go语言内置以下这些基础类型:
布尔类型: bool 。
整型: int8 、 byte 、 int16 、 int 、 uint 、 uintptr 等。
浮点类型: float32 、 float64 。
复数类型: complex64 、 complex128 。
字符串: string 。
字符类型: rune 。
错误类型: error 。
此外,Go语言也支持以下这些复合类型:
指针(pointer)
数组(array)
切片(slice)
字典(map)
通道(chan)
结构体(struct)
接口(interface)
关于错误类型,通道,结构体和接口学习的书上后面有介绍,现在不懂;
在这些基础类型之上Go还封装了下面这几种类型: int 、 uint 和 uintptr 等。这些类型的
特点在于使用方便,但使用者不能对这些类型的长度做任何假设。对于常规的开发来说,用 int
和 uint 就可以了,没必要用 int8 之类明确指定长度的类型,以免导致移植困难。
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
3.2 整型
整型是所有编程语言里最基础的数据类型。Go语言支持表3-1所示的这些整型类型。
3.2.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) // 编译通过
当然,在做强制类型转换时,需要注意数据长度被截短而发生的数据精度损失(比如
将浮点数强制转为整数)和值溢出(值超过转换的目标类型的值范围时)问题。
3.2.2. 数值运算
Go语言支持下面的常规整数运算:+、 - 、*、/和%。加减乘除就不详细解释了,需要说下的
是,% 和在C语言中一样是求余运算,例如:
5 % 3 // 结果为:2
3.2.3. 比较运算
Go语言支持以下的几种比较运算符: > 、 < 、 == 、 >= 、 <= 和 != 。这一点与大多数其他语言相
同,与C语言完全一致。下面为条件判断语句的例子:
i, j := 1, 2
if i == j {
fmt.Println("i and j are equal.")
}
两个不同类型的整型数不能直接比较,比如 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.")
}
3.2.4. 位运算
Go语言支持表3-2所示的位运算符。
Go语言的大多数位运算符与C语言都比较类似,除了取反在C语言写法中是 ~x ,而在Go语言中是 ^x 。
好了,今天就抽空学习了类型,类型中的布尔类型和整型。Go中的类型还是跟C中有些不一样,但总体的思想差不多,有的写法不一样而已。嗯接下来有时间继续学习。GO,Go,Go!
|
请发表评论