Go语言之切片

简介: Go语言之切片

切片


切片(slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的封装。它非常灵活,支持自动扩容。

与数组的区别:

1、定义写法类似

切片:var name []string

数组:var name [5]string 数组必须指定长度数字

2、相互转换

切片可以通过数组转换而来,转换成切片之后,就可以扩容了

package main
import "fmt"
func main() {
  var a = [5]int{1,2,3,4,5}
  fmt.Printf("a的类型是%T\n",a)
  var b = a[0:3]
  fmt.Printf("b的类型是%T\n",b)
}


输出结果:

a的类型是[5]int
b的类型是[]int


切片不能直接转换成数组


切片的构造


1、直接声明

package main
import "fmt"
func main() {
  e := []int{}
  fmt.Printf("%T",e)
}


输出结果:

[]int


2、通过数组转换

package main
import "fmt"
func main() {
  var a = [5]int{1,2,3,4,5}
  fmt.Printf("a的类型是%T\n",a)
  var b = a[0:3]
  fmt.Printf("b的类型是%T\n",b)
}


输出结果:

a的类型是[5]int
b的类型是[]int


上面说了,切片的本质是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)

package main
import "fmt"
func main() {
  a := []int{1,2,3,4,5,6,7,8}
  s1 :=a[0:5]
  fmt.Printf("s1的长度是%v\n",len(s1))
  fmt.Printf("s1的容量是%v\n",cap(s1))
  s2 := a[3:6]
  fmt.Printf("s2的长度是%v\n",len(s2))
  fmt.Printf("s2的容量是%v\n",cap(s2))
}


输入结果:

s1的长度是5
s1的容量是8
s2的长度是3
s2的容量是5


这个结果是正确的,看下图:

1675236645934.jpg

主要说下容量,容量的意思是当长度大于容量,将会报错,并长度最大就是容量的大小


3、通过make函数构造

package main
import "fmt"
func main() {
  d := make([]int,5,10)
  fmt.Println(d)
  fmt.Printf("d的类型是%T\n",d)
}


输出结果:

[0 0 0 0 0]
d的类型是[]int


切片的类型


nil切片:var a []int,这种写法是没有初始化的,未声明内存,不能直接使用

普通切片:var a []int{} 这种写法后面带{},代表初始化切片,申请内存


只要申请了内存的切片就不是nil


package main
import "fmt"
func main() {
  var a []int
  var b = []int{}
  fmt.Printf("a的类型是%T,b的类型是%T\n",a,b)
  fmt.Printf("a的值是%v,b的值是%v\n",a,b)
  if a == nil{
  fmt.Println("a是nil")
  }
  if b == nil {
  fmt.Println("b是一个nil")
  }
}


输出结果:

a的类型是[]int,b的类型是[]int
a的值是[],b的值是[]
a是nil

从上面结果看出,值都hi是一样的,但是只有anil

再说一遍,只要申请了内存就不是nil


切片的拷贝


1、共用底层内存数据

a := make([]int,3) //使用make定义一个切片类型
  b := a             //声明b==a
  b[0] = 100     //赋值切片b第一个元素值为100
  fmt.Println(a)
  fmt.Println(b)


输出结果:

[100 0 0]
  [100 0 0]


换一种写法

package main
import "fmt"
func main() {
  //var a =make([]int,5)
  var a  = []int{1,2,3,4,5}
  b :=a
  b[1] =100
  fmt.Println(a)
  fmt.Println(b)
}


输出结果:

[1 100 3 4 5]
[1 100 3 4 5]


下面拷贝完成后,会生成两个内存位置,不是共享

//切片的拷贝,拷贝完成后,会生成两个内存位置,不是共享
     j :=[]int{1,2,3,4,5}
     k :=make([]int,5,5)
     copy(k,j)
     k[0] = 100
     fmt.Println(j,k)
     /*
     输出结果:[1 2 3 4 5] [100 2 3 4 5]
     */


切片的遍历


//切片的遍历,与数组一样
  c := []int{1,3,5,7}
  for index,value  := range c{
    fmt.Println(index,value)
  }

输出结果:

0 1
  1 3
  2 5
  3 7


切片的追加


//切片的追加
  f :=[]int{1,2,3}
  g :=[]int{4,5,6}
  h :=append(f,g...) //使用append参数可解决这个问题,第二个切片后面需要加...
  fmt.Println(f,g,h)
  /*
  输出结果:
  [1 2 3] [4 5 6] [1 2 3 4 5 6]
  */


切片的删除


也是append参数,把不要的信息不添加到组合中即可

//切片的删除,比如现在要删除一个切片的数据
i := []string{"北京","上海","广州","深圳"}
i =append(i[0:2],i[3:]...)  //从北京到上海组合起来,再从深圳到最后组合起来
fmt.Println(i)
 输出结果:  [北京 上海 深圳]     //间接的删除了广州
相关文章
|
6月前
|
存储 JSON 安全
Go语言切片,使用技巧与避坑指南
Go语言中的切片(Slice)是动态引用数组的高效数据结构,支持扩容与截取。本文从切片基础、常用操作到高级技巧全面解析,涵盖创建方式、`append`扩容机制、共享陷阱及安全复制等内容。通过代码示例详解切片特性,如预分配优化性能、区分`nil`与空切片、处理多维切片等。掌握这些核心知识点,可编写更高效的Go代码。
216 2
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
198 1
|
10月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
10月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
4月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
295 1
|
5月前
|
数据采集 机器学习/深度学习 存储
Go语言实战案例 - 找出切片中的最大值与最小值
本案例通过实现查找整数切片中的最大值与最小值,帮助初学者掌握遍历、比较和错误处理技巧,内容涵盖算法基础、应用场景及完整代码示例,适合初学者提升编程能力。
|
4月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
394 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
259 0
|
4月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
229 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
331 0