Skip to content

Files

Latest commit

1c74697 · May 26, 2022

History

History
164 lines (113 loc) · 3.58 KB

2.3.md

File metadata and controls

164 lines (113 loc) · 3.58 KB

2.3 切片(slice)

切片(slice)是对数组一个连续片段的引用。它是指向底层数组的指针。不需要定义长度。和数组在写法上的区别就是不需要指定长度。

声明:

var identifier []type (不需要说明长度)

示例

var s []string
或
s:=[]string{}

添加内容到切片

s = append(s, "fsd") 

取截取数组到切片

	s := []string{"dd", "fsdf"}
	slice1 := s[1:2]   //[开始:结束]  开始和结束不能大于数组实际长度
	fmt.Println(slice1)

注意切片不能再重新切片,如

	slice1 := slice1[:1]  这样会报错:no new variables on left side of :=

但可以对切片添加内容

slice1 = append(slice1, "aa", "bb")

合并两个切片

	s1 := []int{1, 2}
	s2 := []int{1, 4}
	s1 = append(s1, s2...)
	fmt.Println(s1)

输出:[1 2 1 4]

注意: append切片时候要记着家"...",这是因为append()一个可变参数函数,...允许您从切片将多个参数传递给可变参数函数。

插入指定位置

	s := []string{"aa", "bb", "cc", "dd"}
	//插入指定位置
	index := 2
	temp := append([]string{}, s[index:]...)
	s = append(s[:index], "ee")
	s = append(s, temp...)
	fmt.Println(s) //[aa bb ee cc dd]

删除指定索引元素

    s := []string{"aa", "bb","ee", "cc", "dd"}
    //删除指定索引元素
	index = 2
	s = append(s[:index], s[index+1:]...)
	fmt.Println(s) //[aa bb cc dd]

删除指定值元素

     s := []string{"aa", "bb", "cc", "dd"}
     value := "dd"
	//删除指定值
	for k, v := range s {
		if v == value {
			s = append(s[:k], s[k+1:]...)
		}
	}
	fmt.Println(s) //[aa bb cc]

make() 创建一个切片

当相关数组还没有定义时,我们可以使用 make() 函数来创建一个切片 同时创建好相关数组:

var slice1 []type = make([]type, len)

也可以简写为 slice1 := make([]type, len),这里 len 是数组的长度并且也是 slice 的初始长度。

示例:

var slice1 []string = make([]string , 10)

new() 和 make() 的区别

看起来二者没有什么区别,都在堆上分配内存,但是它们的行为不同,适用于不同的类型。

  • new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于 &T{}
  • make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel。

换言之,new 函数分配内存,make 函数初始化;

	p := new([2]int) //p指针,也可以使用[]进行赋值
	p[0] = 22
	b := make([]int, 10, 50) //第一个参数是类型,第二个参数是分配的空间,第三个参数是预留分配空间
	b[0] = 13
	fmt.Println(p, b)
	打印结果:
	&[22 0] [13 0 0 0 0 0 0 0 0 0]
	

如果想用预留空间

package main

import "fmt"

func main() {
   p := new([2]int)
   p[0] = 22
   
   b := make([]int, 10, 50) //第一个参数是类型,第二个参数是分配的空间,第三个参数是预留分配空间
   a := b[:cap(b)]
   fmt.Println(a)
}

结果:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

多维切片(slice)**

也是同数组一样,slice 可以组合为多维的 slice:

slice := [][]int{{10}, {20, 30}}
slice[0] = append(slice[0], 20)

links