go语言数组、切片和map汇总

        使用go语言也开发了项目已经有比较长的一段时间了,今天来总结一下golang语言的数组相关的一些总结,有时候用了其中一种,但是不知道这个到底是属于数组还是切片还是map。

        1、首先数组

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里面感觉用的比较少,因为不可变,用起来不是很方便,大小定义大了又可能会浪费存储空间。

 数组的使用方法和一般的其他开发语言使用方法差不多,这里不做过多叙述。

2、然后是切片

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

3、最后就是map

        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")

4、结尾

以上就是golang数组相关的基本总结,做此记录,方便查阅。

你可能感兴趣的:(GO语言,golang,开发语言,后端)