一.make函数

  • Go语言中可以使用make函数创建slice 、 map、 channel、 interface
  • 使用make函数定义无内容,但是不是nil的切片,意味着切片已经申请了内存空间

    • make(类型,初始长度[,初始容量])
    • 初始容量可以省略,默认和长度相等
      1. slice := make([]string, 0) //长度为0的切片,没有第三个参数表示容量和长度相等
      2. slice1 := make([]string, 0, 2) //长度为0,容量为2
      3. fmt.Println(slice, slice1)
  • 长度表示切片中元素的实际个数,容量表示切片占用空间大小,且切片容量成倍增加.当增加到1024后按照一定百分比增加.

    • len(slice) 查看切片的长度
    • cap(slice) 查看切片的容量
      1. slice := make([]string, 0) //长度为0的切片,没有第三个参数表示容量和长度相等
      2. slice1 := make([]string, 0, 3) //长度为0,容量为2
      3. fmt.Println(len(slice), cap(slice))
      4. fmt.Println(len(slice1), cap(slice1))

二.append()函数

  • append()在Go语言标准库中源码如下

    1. // The append built-in function appends elements to the end of a slice. If
    2. // it has sufficient capacity, the destination is resliced to accommodate the
    3. // new elements. If it does not, a new underlying array will be allocated.
    4. // Append returns the updated slice. It is therefore necessary to store the
    5. // result of append, often in the variable holding the slice itself:
    6. // slice = append(slice, elem1, elem2)
    7. // slice = append(slice, anotherSlice...)
    8. // As a special case, it is legal to append a string to a byte slice, like this:
    9. // slice = append([]byte("hello "), "world"...)
    10. func append(slice []Type, elems ...Type) []Type
  • 可以向切片中添加一个或多个值,添加后必须使用切片接收append()函数返回值

    1. s := make([]string, 0)
    2. fmt.Println(len(s), cap(s))//输出:0 0
    3. s = append(s, "老张", "佳明哥")
    4. fmt.Println(len(s), cap(s))//输出:2 2
    5. s = append(s, "smallming")
    6. fmt.Println(len(s), cap(s))//输出:3 4
  • 如果添加一次添加多个值,且添加后的长度大于扩容一次的大小,容量和长度相等.等到下次添加内容时如果不超出扩容大小,在现在的基础上进行翻倍

    1. s := make([]string, 0)
    2. fmt.Println(len(s), cap(s)) //输出:0 0
    3. s = append(s, "老张", "佳明哥")
    4. fmt.Println(len(s), cap(s)) //输出:2 2
    5. s = append(s, "smallming")
    6. fmt.Println(len(s), cap(s)) //输出:3 4
    7. s = append(s, "4", "5", "6", "7", "8", "9")
    8. fmt.Println(len(s), cap(s)) //输出:9 9
    9. s = append(s,"10")
    10. fmt.Println(len(s), cap(s)) //输出:10 18
  • 也可以把一个切片的内容直接添加到另一个切片中.需要注意语法中有三个点

    1. s := make([]string, 0)
    2. s1 := []string{"smallming", "佳明哥"}
    3. s = append(s, s1...) //注意此处,必须有三个点
    4. fmt.Println(s)