首页 > 其他分享 >golang切片

golang切片

时间:2023-01-16 15:57:12浏览次数:35  
标签:切片 slice 容量 slice3 fmt golang append

切片

  切片并不是数组或者数组指针,切片只是对数组中连续片断的引用,这个片断可以是整个数组,也可以是由起始索引和终止索引标识的数组,所以切片是一个引用类型。

  // 切片的数据结构
  struct Slice{ 
    byte* array;
    uintgo len; 
    uintgo cap; 
  }
  • 切片是引用类型,但是自身是结构体,调用函数时是值传递。

  • len 属性获取长度,cap 属性获取容量

初始化

  一个切片在未初始化之前默认为 nil,长度为 0

  func main() {
   #初始化3种方法 s1 := []int{} var s2 []int s3 := make([]int,0)
#常见报错 // s1[0] = 1 以下三种赋值都会报错 // s2[0] = 1 panic: runtime error: index out of range [0] with length 0 // s3[0] = 1 s1 = append(s1, 1) // Slice 正确添加值的方式 s2 = append(s2, 1) s3 = append(s3, 1) fmt.Println(s1) fmt.Println(s2) fmt.Println(s3) }

  通过数组创建切片:

func main() {
    arrStr := [10]string{"a","b","c","d","e","f","h","i","j","k"}  #数组
    slice1 := arrStr[:]    // 包含数组的全部元素
    slice2 := arrStr[3:] // 包含从第三个元素起一直到最后一个元素
    slice3 := arrStr[:8] // 包含第8个元素之前的所有元素

   fmt.Println(arrStr)
    //arrStr: [a b c d e f h i j k]
    fmt.Println(slice1)
    fmt.Println(slice2)
    fmt.Println(slice3)

    // 输出:  #切片的格式
    // [a b c d e f h i j k]
    // [d e f h i j k]
    // [a b c d e f h i]
}

append

  切片是一个引用类型,底层是一个数组,所以切片很容易就可以完成动态扩容。

  func main() {
    slice := make([]int,0)
    for i := 0; i < 10; i++ {
      slice = append(slice, i)
      fmt.Printf("长度:%d,容量:%d\n", len(slice), cap(slice))
    }
    // 输出:
    // 长度:1,容量:1
    // 长度:2,容量:2

    // 长度:3,容量:4
    // 长度:4,容量:4

    // 长度:5,容量:8
    // 长度:6,容量:8
    // 长度:7,容量:8
    // 长度:8,容量:8

    // 长度:9,容量:16
    // 长度:10,容量:16
  }

  切片后添加值使用 append 方法,直接在切片尾部添加值,并返回一个新的切片,之前的切片如果没有使用,就会被GC回收.

  根据上面的代码,可以得出:切片在每次长度=容量之后,切片的容量就会扩大两倍

  func main() {
    slice := make([]int,0)
    for i := 0; i < 1030; i++ {
      slice = append(slice, i)
      if i > 1022{
        fmt.Printf("长度:%d,容量:%d\n", len(slice), cap(slice))
      }
    }
    // 输出:
    // 长度:1024,容量:1024

    // 长度:1025,容量:1280
    // 长度:1026,容量:1280
    // 长度:1027,容量:1280
  }

  根据这一次的代码,可以得出:切片的容量超过 1024 (1M)之后,每一次扩容都会增加前一次容量的 1/4

  • 切片的容量在 1024 之下时,每一次扩容容量翻倍
  • 切片的容量在 1024 之上时,每一次扩容容量增加前一次容量的 1/4

切片的遍历

  

package main

import (
    "fmt"
)

func main() {
    var arr [5]int = [...]int{10, 20, 30, 40, 50}
    slice := arr[1:4]
    fmt.Printf("slice: %v\n", slice) //[20 30 40]
    for i := 0; i < len(slice); i++ {
        fmt.Printf("slice[%v]=%v\n", i, slice[i])
    }

    //使用for-range遍历切片
    for index, val := range slice {
        fmt.Printf("slice[%v]=%v\n", index, val)
    }

    //用append内置函数,可以对切片进行动态追加
    var slice3 []int = []int{100, 200, 300}
    //通过append直接给slice追加具体的元素
    slice4 := append(slice3, 400, 500, 600)
    fmt.Printf("slice4: %v\n", slice4)
    slice3 = append(slice3, 400, 500, 600)
    fmt.Printf("slice3: %v\n", slice3)
    //通过append讲切片slce3追加给slice3
    slice3 = append(slice3, slice3...) //追加数组时固定写法slice...
    fmt.Println("slice3=", slice3)
}

 

标签:切片,slice,容量,slice3,fmt,golang,append
From: https://www.cnblogs.com/wushaoyu/p/17055584.html

相关文章

  • golang 为图片加水印
    前段时间一个需求涉及到给图片加水印,考虑图片安全性,决定放在后端加水印。记录一下代码。思路思路是先为水印文字生成一个仅包含水印文字的图片,把这个图片倾斜一定角度(......
  • (转)Golang - new和make的使用和区别(示例详解)
    原文:https://www.cnblogs.com/beatleC/p/16081832.html前言:Go语言中new和make是内置函数,主要用来创建分配类型内存(相同点:堆上),其功能相似,却有本质区别。引入:变量的声明v......
  • (转)golang 函数
    原文:https://www.cnblogs.com/duoke360/p/15663943.htmlgolang函数简介函数的go语言中的一级公民,我们把所有的功能单元都定义在函数中,可以重复使用。函数包含函数的名称......
  • golang实现的一个小游戏–猜数字
    随机生成一个数字,输入一个数字看是否匹对,匹配则结速,反之提示是大了还是小了,代码如下:packagemainimport("bufio""fmt""math/rand""os""strconv""time")var......
  • golang交叉编译
    先设置为运行平台,再设置内核类型,再编译产出常见平台有:android、darwin、linux、windows内核类型提供uname-a可以查看:amd64、arm64、386  setGOOS=linuxsetGOARC......
  • Golang开发 02
    文章目录​​一、Golang开发工具​​​​二、visualstudiocode安装(VScode)​​​​1、安装window​​​​2、安装mac、linux​​一、Golang开发工具#1、Visualstudio......
  • 关于golang中,defer的一个疑问
    代码如下:packagemainimport( "fmt" "os" "os/signal" "syscall")funcmain(){ defertestA() defertestB()() defertestC()()() fmt.Println("running"......
  • windows golang 多版本管理
    下载g软件包源代码链接  https://github.com/voidint/g  二进制包连接 https://github.com/voidint/g/releases在%USERFILE%目录下.g目录创建把解压出来的g.e......
  • 防微杜渐,未雨绸缪,百度网盘(百度云盘)接口API自动化备份上传以及开源发布,基于Golang
    奉行长期主义的开发者都有一个共识:对于服务器来说,数据备份非常重要,因为服务器上的数据通常是无价的,如果丢失了这些数据,可能会导致严重的后果,伴随云时代的发展,备份技术也让......
  • 关于range和切片的思考
    运行一下下面的代码,猜一猜结果会是什么?functest03(){ number03:=[]int{1,2,3,4,5,6} maxlen:=len(number03)-1 fori,e:=rangenumber03{ if......