栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

切片 []type,形似C++ vector【Go基础】

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

切片 []type,形似C++ vector【Go基础】

文章目录
    • 切片的复制,删除和拼接

切片维护了三个元素:
指向底层数组的指针,切片的元素数量和底层数组的容量。由于有指针的存在,所以切片是引用类型
若多个切片由同一数组而来,则对数组的修改将影响全局

package main

import "fmt"



func main() {
	//普通slice
	var slice_1 bool = false
	if slice_1 {
		var a []string
		a = append(a, "hello")
		fmt.Println(a, len(a), cap(a))

		var b [][]string = [][]string{
			[]string{"hello"},
			[]string{"world"},
		}
		fmt.Println(b)
	}

	//由数组得到切片
	//切片的长度是元素的个数,切片的容量是底层数组从切片的第一个元素到最后一个元素的数量
	var slice_2 bool = false
	if slice_2 {
		a1 := [...]int64{1, 3, 5, 7}

		a2 := a1[0:3] //基于一个数组进行切割,左闭右开,包左不包右
		fmt.Print("len:", len(a2), " cap:", cap(a2), "n")
		a3 := a1[1:]
		fmt.Println(a3)
	}

	//从切片再切片时,会将a1构造成数组,
	//切片是引用类型,都指向底层的数组
	var slice_3 bool = false
	if slice_3 {
		a1 := []int{1, 3, 5, 7, 9, 11}
		a2 := a1[0:3]
		fmt.Print("len:", len(a2), " cap:", cap(a2), "n")
		a1[0] = 9
		fmt.Println("a1[0]:", a1[0], " a2[0]:", a2[0])

		a2[1] = 9
		fmt.Println("a1[1]:", a1[1], " a2[1]:", a2[1])
	}

	//a[low:high]为简单的切片表达式
	//a[low:high:max]为完整的切片表达式,与简单切片表达式a[low:high]想同类型,相同长度和元素的切片。另外,它会将得到的结果切片容量设置为max - low
	//在完整切片表达式中只有第一个索引值low可以省略,省略时默认为0,并且max需要大于hight
	var slice_4 bool = false
	if slice_4 {
		a1 := []int{1, 3, 5, 7, 9, 11}
		a2 := a1[0:4]
		a3 := a1[0:4:5]
		fmt.Printf("a2 t:%v len(t):%v cap(t)%vn", a2, len(a2), cap(a2)) //len(t):4 cap(t)6
		fmt.Printf("a3 t:%v len(t):%v cap(t)%vn", a3, len(a3), cap(a3)) //len(t):4 cap(t)5
	}

	
	var slice_5 bool = false
	if slice_5 {
		a1 := make([]int, 5, 10)
		fmt.Printf("a1 t:%v len(t):%v cap(t)%vn", a1, len(a1), cap(a1))
	}

	
}


切片的复制,删除和拼接
package main

import "fmt"



func main() {
	var slice_1 bool = false
	//append追加元素  扩容策略可在 $GOROOT/src/runtime/slice.go
	if slice_1 {
		a1 := make([]string, 0, 10)
		fmt.Println("len:", len(a1), " cap:", cap(a1))
		a1 = append(a1, "hello")
		fmt.Println("len:", len(a1), " cap:", cap(a1))
	}

	var slice_2 bool = false
	//copy 复制切片,避免了浅拷贝
	if slice_2 {
		a1 := make([]int64, 1, 5)
		a2 := a1
		a1[0] = 1
		fmt.Println("len:", len(a1), " cap:", cap(a1), " a1[0]:", a1[0])
		fmt.Println("len:", len(a2), " cap:", cap(a2), " a2[0]:", a2[0])

		a1 = append(a1, a2...)
		fmt.Println("len:", len(a1), " cap:", cap(a1), " ", a1[0], a1[1])
		fmt.Println("len:", len(a2), " cap:", cap(a2), " ", a2[0])

		a3 := []int{1, 3, 5}
		// var a4 []int //此时a4无内存 为nil 无法拷贝,应该使用make
		a4 := make([]int, 2, 5)
		copy(a4, a3)
		fmt.Println(a3, a4) //实际被copy过去的长度为2和3的交集 也就是2
	}

	
	var slice_3 bool = false
	if slice_3 {
		a := []int{1, 3, 5, 7, 9}
		a = append(a[:2], a[3:]...)
		fmt.Println(a)
		fmt.Println(cap(a)) //cap仍然是5

		x1 := [5]int{1, 3, 5, 7, 9}
		a2 := x1[:]
		a2 = append(a2[:2], a2[3:]...)
		fmt.Println("x1:", x1) //[1 5 5 7 9]
		fmt.Println("a2:", a2, " cap(a2):", cap(a2), " len(a2):", len(a2))

		a3 := make([]int, 5, 10)
		for i := 0; i < 10; i++ {
			a3 = append(a3, i)
		}
		fmt.Println("a3:", a3)
	}

	//关于append删除切片中的某个元素
	var slice_4 bool = true
	if slice_4 {
		a1 := [...]int{1, 3, 5, 7, 9, 11, 13, 17}
		s1 := a1[:]
		s1 = append(s1[:1], s1[2:]...)
		fmt.Println(s1)
		fmt.Println(a1)
	}
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/905666.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号