以下内容部分参考自
Go语言基础数据类型
Go语言中的数组切片:特立独行的可变数组
Go语言数据类型-数组
Go标准容器之List
1. 整形
其中比较特殊的是rune和uintptr。
rune 类型是 Unicode 字符类型,和 int32 类型等价,通常用于表示一个 Unicode 码点。rune 和 int32 可以互换使用。
uintptr 是一种无符号的整数类型,没有指定具体的bit大小但是足以容纳指针。 uintptr类型只有在底层编程是才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。
2. 浮点型
Go语言提供了两种精度的浮点数,float32和float64。两者就是范围的不同,具体选择看具体需求。
3. 复数
这种数据类型在其他语言中是比较少见的,Go语言提供了两种精度的复数类型:complex64和complex128,分别对应float32和float64两种浮点数精度。
var z = x + yi //构建复数
x = real(z) //取出实部
y = imag(z) //取出虚部
4. 布尔型
常用的true、false类型。
5. 字符串
Go语言中的字符串比js、c#中的字符串少了一些封装。
比如下标访问直接访问的是字节,获取长度也是字节的长度。想要按字符进行下标访问,需要先用rune执行切片操作。
var s = "123你好";
println(len(s)); //9
println(len([]rune(s))); //5
println(string(([]rune(s))[:4])); //123你
标准库中有四个包对字符串处理尤为重要:bytes、strings、strconv和unicode包。对字符串的常用操作都可以通过这四个包进一步封装。
6. 常量
如常数e和pi,此处不表。
7. Array
//声明
var arr1 [5]int
var arr2 = [5]int{1, 2, 3, 4, 5} //指定长度为5,并赋5个初始值
var arr3 = [5]int{1, 2, 3} //指定长度为5,对前3个元素进行赋值,其他元素为零值
var arr4 = [5]int{4: 1} //指定长度为5,对第5个元素赋值
var arr5 = [...]int{1, 2, 3, 4, 5} //不指定长度,对数组赋以5个值
var arr6 = [...]int{8: 1} //不指定长度,对第9个元素(下标为8)赋值1
//[0 0 0 0 0][1 2 3 4 5] [1 2 3 0 0] [0 0 0 0 1] [1 2 3 4 5] [0 0 0 0 0 0 0 0 1]
fmt.Print(arr1,arr2,arr3,arr4,arr5,arr6);
//获取数组长度
fmt.Print(len(arr1)); //5
//通过下标访问元素
fmt.Print(arr5[2]); //3
//通过range访问元素
for i, v := range arr {
//range具有两个返回值,第一个返回值i是元素的数组下标,第二个返回值v是元素的值。
fmt.Println(i, v)
}
数组是Go语言编程中最常用的数据结构之一。
与部分语言不同的是,Go语言中的数组是值类型的,不是引用类型的。所以调用函数传进一个数组参数,函数内部修改数组参数不会影响外部数组的值。
8.Slice
slice是对底层数组的抽象和控制,使用slice可以动态控制数组的增长和收缩。
//slice声明,3个参数,分别为类型、长度、容量
var arr1 = make([]int,3,5);
//slice声明,不定长度,与数组相似,但是[]中间不需要指定长度
var arr2 = []int{1, 2, 3, 4, 5};
//数组动态增加元素
arr2 = append(arr2,6);
fmt.Print(arr2); //[1 2 3 4 5 6]
类型、长度和Array一样理解,容量指给数组变动预留的内存大小,提前给你划好内存区域,如果扩展长度不用重新申请内存。
append操作会每次考察你的容量是否足够,如果不够会重新申请内存,所有设置合理的容量,可以避免反复申请内存,提高性能。
这里我并没有提到删除元素的方法,因为从slice这种数据结构来看,本身并不适合做删除操作。抛开语言,只谈数据结构,我们知道数组删除是会移动元素的,效率会比较低。当然任何语言的数组实现(顺序存储),删除元素都避免不了移动元素。
所以,如果会频繁删除中间或开头的元素,更好的是选择链表这样的数据结构,如map或container/list包。
如果一定要执行删除操作的话,可以这么写:
var arr = []int{1, 2, 3, 4, 5};
var deleteIndex = 2; //待删除的元素下标
var newArr = append(arr[:deleteIndex],arr[deleteIndex+1:]...);
fmt.Print(newArr); //[1 2 4 5]
9.Map
Go语言中的映射类型,相当于哈希表。
var temp1 = make(map[string]int); //初始化
temp1["dog"] = 233; //添加值
println(temp1["dog"]) //233
var value,isExist = temp1["cat"]; //value-值,isExist-是否存在这个key
println(value); //0
println(isExist); //false
var temp2 = map[string]int{"one":1,"two":2}; //初始化
println(len(temp2)); //2
delete(temp2,"two"); //删除值
println(len(temp2)); //1
10.List
使用起来非常方便、简单的动态数组。
var list = list2.New();
list.PushBack(1);
list.PushBack(2);
list.PushFront(3);
list.PushFront(4);
list.Remove(list.Front());
list.InsertBefore(5,list.Front());
//遍历数组,输出:5312
for e := list.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value)
}