Go语言中的数据结构
go中内置的基本数据类型有int、float、bool、string等,不做太多解释,需要注意的是string在go中也是内置的基本数据类型。
1--数组
1.1--一维数组
func main() {
// 数组
array1 := [3]int{1, 2, 3}
array2 := [3]int{}
array2 = [3]int{4, 5, 6}
fmt.Println("array1---", array1)
fmt.Println("array2---", array2)
}
输出为
array1--- [1 2 3]
array2--- [4 5 6]
array1 := [3]int{1, 2, 3}是使用简短变量定义定义了一个数组array1,其中array1是数组名,[]中的3表示要定义的数组容量,int为数组中要存储的数据的类型,{}中的数据表示要存储的数据,用逗号分隔; array1是在定义数组的同时初始化,而array2是先定义一个数组,然后再对其进行初始化。
1.2--多维数组
如二维数组:
func main() {
array3 := [...][3]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
array4 := [4][3]int{}
array4 = [...][3]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}
fmt.Println("array3===", array3)
fmt.Println("array4===", array4)
}
输出为
array3=== [[1 2 3] [4 5 6] [7 8 9]]
array4=== [[1 2 3] [4 5 6] [7 8 9] [10 11 12]]
二维数组基本上与一维数组一样,[]中的...表示长度不确定,以初始化时的长度为准,一维数组中也可这么用。
1.3--数组的局限性
- 数组的长度和类型是在初始化的时候就固定的,即一旦定义后就不可再改变,这就很不灵活,比如我也不确定数组大小的时候,就无法使用数组了。
2--切片slice
切片是动态数组,即长度可变的数组,当数组容量不足时,会进行自动扩容,以此来适应不确定数组长度的场景,使数组变得灵活。
slice1 := []rune{'元', '旦', '快', '乐'}
array5 := [...]string{"元", "旦", "快", "乐"}
slice2 := array5[:2]
fmt.Println("slice1===", string(slice1))
fmt.Println("slice2===", slice2)
slice4 := make([]int, 5, 10)
slice4 = append(slice4, 666)
fmt.Println("slice4===", slice4)
输出为
slice1=== 元旦快乐
slice2=== [元 旦]
slice4=== [0 0 0 0 0 666]
slice1是直接定义了一个切片并初始化,其定义方法与数组类似,只是[]中不指定长度即可;slice2是从数组array5中切出来的切片,即将array5中从下标为0开始到下标为2结束之间的元素切出来,包括0但不包括2;内置方法make()可以创建一个切片,其中第一个参数表示要创建的类型,这里为int类型的切片,第二个参数表示切片底层数组的初始长度,第三个参数表示数组的初始容量,当make中没有第三个参数时,表示初始容量和初始长度一样;
ps
- 切片是引用类型,切片变量存储的是底层数组的开始地址,即0x---,也就是说可以通过切片改变底层数组中的数据。
- 切片的原理是动态数组,可以通过append将想要添加的元素追加到数组的末尾,当数组已满时,就按照不同的策略进行扩容,需要注意的是,append会将元素追加到数组末尾,当初始容量大于0时,数组中会有默认的零值,新元素会追加到零值的后面,如slice4所示;
3--map
map和别的语言一样,也是一种key-value键值对映射的存储方式,
map1 := make(map[string]string, 3)
map1["董事长"] = "张三"
map1["总经理"] = "李四"
map1["经理"] = "王五"
fmt.Println(map1)
输出为
map[总经理:李四 经理:王五 董事长:张三]
map中还有一种可以判断某个键是否存在的方式,如
map1 := make(map[string]string, 3)
map1["董事长"] = "张三"
map1["总经理"] = "李四"
map1["经理"] = "王五"
fmt.Println(map1)
value, ok := map1["会计"]
if ok {
fmt.Println("目标存在--", value)
} else {
fmt.Println("目标不存在")
}
value1, ok1 := map1["总经理"]
if ok1 {
fmt.Println("目标存在--", value1)
} else {
fmt.Println("目标不存在")
}
输出为
map[总经理:李四 经理:王五 董事长:张三]
目标不存在
目标存在-- 李四
如果不使用上面这种方式的话,如果查找到key不存在,就会返回对应类型的零值,这里为nil; 想要删除map中的元素的话可以使用内置的delete()函数,
map1 := make(map[string]string, 3)
map1["董事长"] = "张三"
map1["总经理"] = "李四"
map1["经理"] = "王五"
fmt.Println(map1)
delete(map1, "总经理")
fmt.Println(map1)
输出为
map[总经理:李四 经理:王五 董事长:张三]
map[经理:王五 董事长:张三]
结束语
文章仅做个人学习交流,也许并不完全正确,欢迎指正;