Go语言第3天 - 常用数据类型

以下内容部分参考自
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)
}

11.待补充...

你可能感兴趣的:(Go语言第3天 - 常用数据类型)