从零学习go语言(三)

95 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

集合类型

很多同一类型的元素放在一起的场景就是集合

Go语言的集合类型包括:

  1. 数组(array)
  2. 切片(slice)
  3. 映射(map)

数组(array)

数组存放的是固定长度、相同类型的数据,存放的元素是连续的,数据类型没有限制。

声明数组

array := [5]string{"a","b","c","d","e"}
//不声明长度,自动推导
array := [...]string{"a","b","c","d","e"}
//初始化特定元素必须声明长度
arrayA := [5]string{1:"a",3:"b"}

打印数组

func main() {
   array := [5]string{"a","b","c","d","e"}
   for i := 0; i < 5; i++ {
      fmt.Printf("数组索引:%d,对应值:%s\n\n", i, array[i])
   }
}

Go语言有一种新型的循环for range,也可以实现循环,并且更加简便。

func main() {
   array := [5]string{"a", "b", "c", "d", "e"}
   for i, v := range array {
      fmt.Printf("数组索引:%d,对应值:%s\n\n", i, v)
   }
}

也可以通过 _ 将数组的索引丢弃。

切片(slice)

array := [5]string{"a", "b", "c", "d", "e"}
slice := array[2:5]
fmt.Println(slice)

基于数组生成切片,包含第一个索引,不包含第二个索引。所以上面例子输出c d e。

切片也有简便的写法,array[:4]相当于array[0:4]、array[1:]相当于array[1:array.length]、array[:]相当于array[0:array.length]

切片修改

array := [5]string{"a", "b", "c", "d", "e"}
slice := array[2:5]
slice[0] = g
fmt.Println(array) // a b g d e

上例说明切片基于数组,修改切片也是在修改数组。

切片声明

  1. 切片长度:切片中元素的个数
  2. 切片容量:切片的空间
slice1 := make([]string,4)//元素类型为string的切片长度是4
slice2 := make([]string,4,8)//指定切片的容量为8,注意切片的容量不能比切片的长度小
slice3 := []string{"a","b","c","d"}//字面量方式初始化

Append

//追加元素
slice2 := append(slice,"f","r")
//追加切片
slice2 := append(slice,slice2...)

容量不足的时候会自动扩容

注意:在新建切片的时候,最好使长度和容量相同,这样在追加操作的时候会生成新的底层数组。

切片循环

与for相同

映射(Map)

无序的k-v键值对组合,所有的k类型相同,所有的v类型相同,但是k和v类型不必相同。

声明初始化

nameAgeMap := make(map[string]int)
nameAgrMap["xiaoyu"] = 19
nameAgeMap := map[string]int{"xiaoyu":19}

[ ]里为key的类型,后面的是value的类型

Map的获取和删除

//添加键值对
nameAgeMap["yu"] = 19
//获取指定key对应的value
age := nameAgeMap["yu"]

如果key不存在返回的是该类型的零值

delete(nameAgeMap,"yu")

遍历Map

for range 返回两个值

  1. key
  2. value
for k,v := range nameAgeMap{
   fmt.Println("key",k,"value",v)
}

Map的大小

fmt.Println(len(nameAgeMap))

String和 []byte

s := "Hello"
b := []byte(s)
fmt.Println(s[0])

字符串可以使用s[0],注意:在UTF8的编码下,一个汉字对应三个字节。