go语言编程初学二
枚举
枚举之一系列相关的常量,比如一个星期中每天的定义
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberofDays
)
同Go语言的其他符号一样,以大写字母开头的常量在包外可见,以上numberofDays为包内私有,其他的则可被其他包访问
类型
Go语言内置以下这些基础类型:
布尔类型: bool
整型: int8、byte、int16、int、uint、uintptr等
浮点型:float32、float64
复数类型: complex64、complex128
字符串:string
错误类型:error
此外,go语言也支持一下这些复合类型
指针 pointer
数组 array
切片 slice
字典 map
通道 chan
结构体 struct
接口 interface
布尔类型
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: ture
整型
类 型 长度(字节) 值 范 围
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字节
需要注意的是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) // 编译通过
数值运算
go语言支持常规整数运算: + - * / %
% 和在C语言中一样是求余运算
5 % 2 //结果为2
比较运算
> < == >= <= !=
i, j := 1, 2
if i == j {
fmt.Println(" i and j are equal.")
}
两个不同类型的整型不能直接比较,比如int8类型的数和int类型的数不能直接比较
不过各种类型的整型变量都可以直接与字面常量进行比较
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. ")
}
位运算
运 算 含 义 样 例
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
浮点型
浮点型用于表示包含小数点的数据,比如1.234就是一个浮点型数据
go语言定义了两个类型float32和float64, 其中float32等价于C语言的float类型
float64等价于C语言的double类型
var fvalue1 float32
fvalue1 = 12
fvalue2 := 12.0 //如果不加小数点,fvalue2会被推导为整型而不是浮点型
数组
数组是Go语言编程中最常用的数据结构之一,数组就是指一系列同一类型的集合
[32]byte // 长度为32的数组,每个元素为一个字节
[2*N] struct { x, y int32 } // 复杂类型数组
[1000]*float64 // 指针数组
[3][5]int // 二维数组
[2][2][2]float64 // 等同于[2]([2]([2]float64))