Go语言--切片(Slice)详解

作者:归子莫 时间:2024-04-25 15:28:15 

说明:

Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

一、定义切片

注意:切片不需要说明长度

1、声明一个未指定大小的数组来定义切片


var identifier []type
//例如
var slice []int

2、使用make()函数来创建切片


var slice1 []type = make([]type, len)
//也可以简写为
slice1 := make([]type, len)
//例如
slice := make([]type, len)

二、切片是可索引的

1、len() 和 cap() 函数

可以由 len() 方法获取长度。

切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少


package main

import "fmt"

func main(){
   var number = make([]int,3,5)
   fmt.Printf("len=%d cap=%d         slice=%v\n",len(number),cap(number),number)
}

//len=3 cap=5 slice=[0 0 0]

2、空(nil)切片

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


package main

import "fmt"

func main(){
   var number []int
   fmt.Printf("len=%d cap=%d slice=%v\n",len(number),cap(number),number)
}

//len=0 cap=0 slice=[]

三、切片截取

可以通过设置下限及上限来设置截取切片 [lower-bound:upper-bound]


package main

import "fmt"

func main() {
   //创建切片
   number := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
   printSlice(number)

//打印原始切片
   fmt.Println("number == ", number)

//打印子切片从索引1到索引4
   fmt.Println("number == ", number[1:4])

//打印子切片默认下限
   fmt.Println("number == ", number[:3])

//打印子切片默认上限
   fmt.Println("number == ", number[4:])

}

func printSlice(x []int) {
   fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

结果:

Go语言--切片(Slice)详解

四、增加切片的容量

原理:创建一个新的更大的切片并把原分片的内容都拷贝过来


append() 和 copy() 函数
package main

import (
   "fmt"
)

func main() {
   //创建切片
   var number []int
   printSlice(number)

//允许追加空切片
   number = append(number,0)
   printSlice(number)

//向切片添加一个元素
   number = append(number,1)
   printSlice(number)

//同时添加多个元素
   number = append(number,2,3,4)
   printSlice(number)

//创建的新的切片是之前的切片容量的两倍
   number1 := make([]int,len(number),(cap(number))*2)

//拷贝number的内容到number1中
   copy(number1,number)
   printSlice(number1)
}

func printSlice(x []int) {
   fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

Go语言--切片(Slice)详解

来源:https://zhuanlan.zhihu.com/p/137152510

标签:Go语言,切片,Slice
0
投稿

猜你喜欢

  • 如何尽快释放掉Connection对象建立的连接?

    2009-12-16 18:38:00
  • Django框架中模型的用法

    2022-02-15 00:34:14
  • 使用Python中的pytesseract模块实现抓取图片中文字

    2021-05-06 18:10:28
  • JavaScript实现简单随机点名器

    2024-04-10 16:18:39
  • 美之鉴 – 女人与Web设计

    2009-12-09 15:36:00
  • 如何用用Python制作NFT区块链作品

    2022-11-21 22:51:09
  • 利用pyuic5将ui文件转换为py文件的方法

    2023-03-20 05:01:43
  • Go中时间与时区问题的深入讲解

    2024-02-19 23:34:55
  • 使用Termux在手机上运行Python的详细过程

    2021-10-26 10:23:52
  • Python使用win32 COM实现Excel的写入与保存功能示例

    2021-03-30 11:28:50
  • 对python中不同模块(函数、类、变量)的调用详解

    2022-01-17 14:36:38
  • MySQL存储引擎简介及MyISAM和InnoDB的区别

    2024-01-26 23:53:17
  • PHP实现二维数组中的查找算法小结

    2023-09-08 05:08:24
  • SQL参数化查询的另一个理由 命中执行计划

    2012-08-21 10:31:16
  • django时区问题的解决

    2022-06-09 10:56:45
  • 使用python制作一个解压缩软件

    2023-04-27 19:08:37
  • python排序算法之希尔排序

    2023-03-03 13:50:48
  • 9种python web 程序的部署方式小结

    2021-04-14 10:39:44
  • python实现定时发送qq消息

    2021-08-17 00:10:34
  • SQL常用的四个排序函数梳理

    2024-01-13 04:41:49
  • asp之家 网络编程 m.aspxhome.com