• go_切片


    go语言中切片相当于array的一个view。
    其底层实现如下

    ptr指的是slice中打头的元素。
    len表示slice的长度。
    cap表示ptr到整个array的长度


    slice可以向后扩展,但不能超过对应数组的长度,但是不能向前扩展





    package main
    
    import "fmt"
    
    //[]int不加长度表示slice
    func updateSlice(s []int) {
    	s[0] = 100
    }
    func main() {
    	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
    	s1 := arr[2:6] //左闭右开,arr[:]这种结构表示切片
    	s2 := arr[:6]
    	s3 := arr[2:]
    	s4 := arr[:]
    	fmt.Println(s1, s2, s3, s4)
    
    	updateSlice(s3)
    	fmt.Println(s3)
    
    	updateSlice(s4)
    	fmt.Println(s4)
    
    	fmt.Println(arr)
    
    	fmt.Println("reslice") //slice上还可以继续建立slice
    	fmt.Println(s3)
    	s3 = s3[:3]
    	fmt.Println(s3)
    	s3 = s3[2:]
    	fmt.Println(s3)
    
    	fmt.Println("Extending slice")
    	arr[0], arr[2] = 0, 2
    	s11 := arr[2:6]
    	s12 := s11[3:5]
    	fmt.Printf("s11=%v,len(s11)=%d,cap(s11)=%d
    ", s11, len(s11), cap(s11))
    	fmt.Printf("s12=%v,len(s12)=%d,cap(s12)=%d
    ", s12, len(s12), cap(s12))
    	fmt.Println(" ")
    	s13 := append(s12, 10)
    	s14 := append(s13, 11)
    	s15 := append(s14, 12)
    	fmt.Println("s13,s14,s15", s13, s14, s15)
    	fmt.Println("arr=", arr)
    	//往一个数组中添加数据,可以先把数组变成arr[:]切片,然后再用append()函数往尾部添加值
    }
    

      slice的操作

    package main
    
    import "fmt"
    
    func printSlice(s []int){
    	fmt.Printf("%v,len=%d,cap=%d
    ",s,len(s),cap(s))//每当装不下的时候就乘2扩充cap
    }
    func main() {
    	fmt.Println("创建slice")
    	var s []int//Zero value for slice is nil
    	for i:=0;i<100;i++{
    		printSlice(s)
    		s = append(s , 2 * i + 1)
    	}
    	fmt.Println(s)
    
    	//其他创建slice的方法
    	s1 :=[]int{2,4,6,8}//给slice初始一些值
    	printSlice(s1)
    
    	s2 :=make([]int ,16)//创建一个len为16的slice
    	s3 :=make([]int ,16,32)//创建一个len为16,cap为32的slice
    	printSlice(s2)
    	printSlice(s3)
    
    	fmt.Println("复制切片")
    	copy(s2,s1)
    	printSlice(s2)
    
    	fmt.Println("删除切片中的元素")
    	s2=append(s2[:3],s2[4:]...)
    	printSlice(s2)
    
    	fmt.Println("拿到头")
    	front:=s2[0]
    	s2 =s2[1:]
    	fmt.Println(front)
    	printSlice(s2)
    
    	fmt.Println("拿到尾")
    	tail:=s2[len(s2)-1]
    	s2 =s2[:len(s2)-1]
    	fmt.Println(tail)
    	printSlice(s2)
    
    }
    

      

  • 相关阅读:
    API文档大集合
    jenkins 构建 job 并获取其状态的实现
    jenkins 插件乱码处理与文件上传
    更优雅的配置:docker/运维/业务中的环境变量
    部署仓库中 nginx 下游依赖配置改进
    dotnet core 在 MIPS64 下的移值进度:EA 版本已经发布
    tmux 编译安装过程
    各数据源的时间/日期的提取能力对比
    关于若干性能指标的阐述
    为缓存、外部接口调用添加超时处理
  • 原文地址:https://www.cnblogs.com/luffe/p/8544448.html
Copyright © 2020-2023  润新知