Go 语言入门指南:基础语法和常用特性解析 | 青训营

182 阅读4分钟

一.Golang切片(slice)

1、切片的定义

     是对数组的一个连续片段的引用,所以切片是一个引用类型。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。注意:终止索引标识的项不包括在切片内。切片提供了一个动态窗口。
        建立在数组(长度固定不变)之上的抽象,并且提供更强大的能力和便捷。
        是golang的一种特有的数据结构。

2、切片的基本语法

1)定义一个切片,然后让切片去引用一个已经创建好的数组基本语法
            var 切片名 []类型 = 数组的一个片段引用
            var intarr [6]int = [6]int{3, 6, 9, 1, 4, 7}
            var slice []int = intarr[1:3]
    (2)通过make内置函数来创建切片。基本语法
            切片名 := make([]类型,长度,容量)
            //定义切片:make函数的三个参数:1、类型2、长度3、容积
            Slice := make([]int,4,20)   //[0,0,0,0]
            Slice[0] = 6
            Slice[1] = 8     //[6,8,0,0]
       make在底层创建一个数组,对外不可见,不可直接操作/维护这个数组
       要通过slice切片去间接的访问各个元素。
    (3)定义一个切片,直接就指定具体数组(对外不可见),使用原理类似make的方式
           Slice := []int{1,4,7}
           func main() {
               //定义数组
               var intarr [6]int = [6]int{3, 6, 9, 1, 4, 7}
               //切片构建在数组之上
               //定义一个切片slice,[]动态变化数组长度不写,int类型,intarr是原数组
               //[1:3]切片 - 切出的一段片段 - 索引:从1开始,到3结束(不包含3)
               var slice []int = intarr[1:3]    //前包括后不包括
               fmt.Println(intarr)
               fmt.Println(slice)
               //切片元素个数
               fmt.Println(len(slice))
               //获取切片的容量:容量可以动态变化
               fmt.Println(cap(slice))
           }

** 切片有三个字段的数据结构(结构体):一个是指向底层数组的指针,一个是切片的长度,一个是切片的容量。 通过切片可以更改原数组里面的值。**

3、切片的遍历

4、切片的注意事项

(1)切片定义后不可以直接使用,需要让其引用到一个数组,或者make一个空间供切片来使用。直接使用输出[]。

(2)切片使用不可以越界。

(3)简写方式

var slice = arr[0:end]  ------>  var slice = arr[:end]

var slice = arr[start:len(arr)]  ------>  var slice = arr[start:]

var slice = arr[0:len(arr)]  ------>  var slice = arr[:]

(4)切片可以继续切片

var intarr [6]int = [6]int{3, 6, 9, 1, 4, 7}

var slice1 []int = intarr[1:5]

Slice2 := slice[1:2]

(5)切片可以动态增长

 底层原理
    1、底层追加元素的时候对数组进行扩容,老数组扩容为新数组
    2、创建一个新数组,将老数组中的6,9,1,4复制到新数组中,再追加两个元素8,2
    3、slice2底层数组的指向是新数组,老数组是不变的
    4、往往我们在使用追加的时候想要做的效果是给一个slice进行追加
    5、底层的新数组还是不能维护,需要通过切片来进行间接维护操作
    6、可以通过append函数将切片追加给切片

(6)切片的拷贝

a := []int{1,4,7,3,6,9}
b := make([]int,10)
//拷贝
copy(b,a)   //a里面的元素给b
fmt.Printf("a:%v     b:%v\n",a,b)

二. 映射(map)

1、映射的定义

Go语言中内置的一种类型,它将键值相关联,我们可以通过键key来获取值value。类似其他语言的集合。

2、基本语法

             Var  map变量名  map[key_type]value_type

  (1)Key、value的类型:bool,数字,string,指针,channel,还可以是只包含前面几个类型的接口、结构体、数组。
  
  (2)Key通常intstring类型,value通常为数字(整数、浮点数)、stringmap、结构体。
  
  (3)Key部分Slice、map、function不可以
  

多种基本语法

3、特点

    (1)map集合在使用之前一定要make

    (2)Map的key-value时无序的

    (3)Key有唯一性,当key一样时后面的value会替换前面的value

    (4)Value可以重复 

    (5)make函数的第二个参数可以省略,默认分配一个内存
    

4、相关操作

1)增加和更新操作

            Map[“key”] = value  ------>  如果key还没有的话就添加,如果key已经存在,就是修改。

    (2)删除操作

            delete(map,”key”)  ------>  如果key存在则删除,不存在则不进行任何操作也不会报错

            delete(b,202102)

    (3)清空操作(没有提供单独的函数直接清空)

          1、 如果我们想删除map的所有key,没有一个专门的方法一次删除,可以遍历一下                         key,逐个删除。

          2、或者map = make(),make一个新的,让原来的成为垃圾,被gc收回

    (4)查找操作

           Value,bool = map[key]

           根据key找value,还有一个bool值看存不存在这个key值。

    (5)获取长度

            len(map名)      len(b)

    (6)遍历操作
        //遍历:

        for k,v := range c {

            fmt.Printf("key:%v  value:%v   \t",k,v)
            
        }

5、加深难度