使用go语言也开发了项目已经有比较长的一段时间了,今天来总结一下golang语言的数组相关的一些总结,有时候用了其中一种,但是不知道这个到底是属于数组还是切片还是map。
golang数组是一种数据结构,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,关键字是长度固定,我称之为固定数组,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。
数组如下举例
var arrayName [size]dataType
其中arrayName是数组名称,以后都通过该名称来调用数组,size是数组的长度,即数组的大小,dataType是数组类型,类型可以是基本的字符串、整形等类型,也可以是自定义的结构体类型。例如下面详细的例子
var arrayint [3]int //定义大小为3的整形int数组
var arraystring [10]string //定义大小为10的字符串数组
type structDemo struct {
Id int `json:"id"`
Ip string `json:"ip"`
Name string `json:"name"`
Number int `json:"number"`
}
var arrayStruct [10]structDemo //定义大小为10的自定义结构体数组
其实数组的核心点就是长度固定,不可变;数组在golang里面感觉用的比较少,因为不可变,用起来不是很方便,大小定义大了又可能会浪费存储空间。
数组的使用方法和一般的其他开发语言使用方法差不多,这里不做过多叙述。
Go 语言切片是对数组的抽象, 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。最后总结就是切片也可以称之为数组,只是他是可变数组,长度根据使用过程中自动增加长度。
切片如下举例:
var sliceData []dataType //和数组差不多,只是切片不需要说明长度。
//切片还有另外两种定义方法:使用 make() 函数来创建切片:
var sliceData []dataType = make([]dataType, len)
//也可以简写为
sliceData := make([]dataType , len)
其中len表示切片的初始长度,可以设置len=0,表示空切片,具体的例子如下,我在使用中一般设置len为0,表示是新增的空切片。
var sliceDataint []int
var sliceDatastring []string
sliceData := make([]string,0)
sliceData := make([]structDemo,0)
切片通过append来往切片里面增加数据,然后通过截取来删除数据,切片没有直接的删除的功能,如下所示:
var numbers []int
/* 允许追加空切片 */
numbers = append(numbers, 0)
/* 向切片添加一个元素 */
numbers = append(numbers, 1)
/* 同时添加多个元素 */
numbers = append(numbers, 2,3,4)
//针对自定义的结构体数据一样
上面的代码打印出numbers里面的内容是1,2,3,4
在这里需要说明一个简单的排序用法,一般像append(numbers,1)这种是在已有的切片numbers最后面添加一个元素,顺序是在最后;可能我们有这么个需求,需要把新加的元素放在numbers的最前面,需要达到这样的要求,操作代码如下:
var numbers []int
/* 向切片添加一个元素 */
numbers = append(numbers, 1)
/* 同时添加多个元素 */
numbers = append([]int{2,3,4},numbers...)
//针对自定义的结构体数据一样
上面的代码打印出来的numbers数据内容为2,3,4,1,颠倒一下传参,顺序就改变了,感觉还可以,挺好玩的。
切片的删除一般通过截取来实现:截取分为连续截取和中间截取:
连续截取很简单,实例代码如下:
numbers := []int{0,1,2,3,4,5,6,7,8}
/* 截取切片从索引1(包含) 到索引4(不包含),输出为1,2,3*/
fmt.Println("numbers[1:4] ==", numbers[1:4])
/* 默认下限为 0,输出为0,1,2*/
fmt.Println("numbers[:3] ==", numbers[:3])
/* 默认上限为 len(s),即输出4后面的所有数据,输出为4,5,6,7,8*/
fmt.Println("numbers[4:] ==", numbers[4:])
//打印信息
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
然后就是中间截取,中间截取要稍微复杂一些,但是代码也很少,如下所示
numbers := []int{0,1,2,3,4,5,6,7,8}
count := 0
//中间截取方法,例如你想删除4和7这两个元素,操作代码如下
for _, value := range numbers {
if value != 4 && value != 7{
numbers[count] = value
count++
}
}
numbers = numbers[:count]
//打印出来的信息如下:0,1,2,3,5,6,8
Map 是一种无序的键值对的集合;Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,遍历 Map 时返回的键值对的顺序是不确定的。在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 ""。Map 是引用类型,如果将一个 Map 传递给一个函数或赋值给另一个变量,它们都指向同一个底层数据结构,因此对 Map 的修改会影响到所有引用它的变量。
我的理解map的容量和切片一样,可以自定扩容,开始可以设置初始容量大小
/* 使用 make 函数创建map */
map_variable := make(map[KeyType]ValueType, initialCapacity)
其中 KeyType 是键的类型,可以是int,string,float等,不能是结构体类型
ValueType 是值的类型,可以是任意类型,包括结构体类型
initialCapacity 是可选的参数,用于指定 Map 的初始容量,我一般都置为0,后面再赋值的时候map会自动扩容。如果不指定 initialCapacity,Go 语言会根据实际情况选择一个合适的值。map的基本操作如下:
// 创建一个初始容量为 10 的 Map
m := make(map[string]int, 10)
// 使用字面量创建 Map
m := map[string]int{
"apple": 1,
"banana": 2,
"orange": 3,
}
//上面是两种新建map的两种方法
//接下来是map的获取元素:
//通过键值对获取
v2, ok := m["pear"] // 如果键不存在,ok 的值为 false,v2 的值为该类型的零值,这样就可以通过ok来判断map值是否存在
//修改元素:
m["apple"] = 5
// 获取 Map 的长度
len := len(m)
// 遍历 Map
for k, v := range m {
fmt.Printf("key=%s, value=%d\n", k, v)
}
删除元素:
// 删除键值对, 删除前最好是先判断下key值是否存在,存在再删除
delete(m, "banana")
以上就是golang数组相关的基本总结,做此记录,方便查阅。