切片初识

切片介绍

在初始定义数组时,我们并不知道需要多大的数组,因此我们就需要“动态数组”。在Go里面这种数据结构叫slice。 切片解决了数组长度不能扩展,以及基本类型数组传递时产生副本的问题。


集合map

算法贴士

需要使用任意类型的关联,就需要用到集合,比如学号和名字。Go语言提供了映射关系容器是map,内部使用散列表(hash)实现。

大多数语言中映射关系容器使用两种算法:散列表和平衡树。


指针

指针的创建

Go保留了指针,代表某个内存地址,默认值为nil,使用&取变量地址,通过*访问目标对象。

简单示例:

1
2
3
4
5
v := "3"
ptr := &v
value := *ptr
fmt.Printf("指针地址为:%p\n", ptr) // 输出0x.....16进制数
fmt.Printf("指针地址内存储的值为:%s\n", value) // 输出3

数组

数组的声明

数组是一段固定长度的连续内存区域。数组的长度定义后不可更改,长度使用 len() 获取。

1
2
3
4
5
6
var arr1 [10]int					//定义长度为10的整型数组,很少这样使用
arr2 [5]int := [5]int{1,2,3,4,5} //定义并初始化
arr3 := [5]int{1,2,3,4,5} //自动推导并初始化
arr4 := [5]int{1,2} //指定总长度,前几位被初始化,没有的使用零值
arr5 := [5]int{2:10, 4:11} //有选择的初始化,没被初始化的使用零值
arr6 := [...]int{2,3,4} //自动计算长度

字符串

字符型

Golang 中没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存,且使用单引号包裹。
字符类型可以以d%打印为整型。

1
2
3
4
5
6
7
8
9
var c1 byte = 'a'
var c2 byte = '0'

fmt.Println("c1=", c1) //输出 97
fmt.Println("c2=", c2) //输出48
fmt.Printf("c1=%c,c2=%c\n", c1, c2) //输出原值 a 0

//var c3 byte = '北'
//fmt.Printf("c3=%c", c3) //溢出错误

数值类型

整数类型

整数类型有无符号(如int)和带符号(如uint)两种,这两种类型的长度相同,但具体长度取决于不同编译器的实现。

int8、int16、int32和int64四种有符号整数类型,分别对应8、16、32、64bit大小的有符号整数,同样uint8、uint16、uint32和uint64对应四种无符号整数类型。


进制与转换

常见进制

  • 二进制:只有0和1,Go中不能直接使用二进制表示整数
  • 八进制:0-7,以数字0开头
  • 十进制:0-9
  • 十六进制:0-9以及A-F,以0X开头,A-F以及X不区分大小写

流程控制之-条件语句

判断语句 if

if判断示例:

1
2
3
//初始化与判断写在一起: if a := 10; a == 10
if i == '3' {
}

if的特殊写法:

1
2
if err := Connect(); err != nil {         // 这里的 err!=nil 才是真正的if判断表达式
}

运算符

运算符汇总

1
2
3
4
5
6
算术运算符:	+	-	*	/	%	++	--	
关系运算符: == != <= >= < >
逻辑运算符: ! && ||
位运算: &(按位与) |(按位或) ^(按位取反) <<(左移) >>(右移)
赋值运算符: = += -= *= /= %= <<= >>= &= ^= |=
其他运算符: &(取地址) *(取指针值) <-(Go Channel相关运算符)