识字粗堪供赋役,不须辛苦慕公卿。这篇文章主要讲述Go 语言入门很简单 -- 7. Go Slices #私藏项目实操分享#相关的知识,希望能为你提供帮助。
切片 slice切片可以算是数组的一部分。 像数组一样,切片亦是可索引的并且有长度。 与数组不同,切片这个长度是可以改变的。
切片是灵活且可扩展的数据结构,可以根据需要增长和缩小。 像数组一样,切片可以索引并且有长度。 在 Go 中,数组允许您定义可以保存相同类型数据项的变量,但它不提供任何内置方法来动态增加其大小或获取子数组,但切片克服了数组的这种限制。
切片的定义Slice 是可以调整大小的数组段,因此与数组相比,它更灵活。 像数组一样,切片是可索引的并且有长度。 切片是一种轻量级结构,它包装并表示数组的一部分。
var x []float64
切片的声明就像数组一样,但它不包含切片的大小。。 在这种情况下,x 的创建长度为 0,因此,它变得灵活且具有动态大小以适应需求。
如果你想要创建一个切片 slice ,应该使用内置的 ??
?make?
?? 函数,切片是使用 ??make ?
?函数创建的。:x := make([]float64, 3)
这将创建一个长度为 3 的类型为 float64 数组关联的切片,切片始终与某个数组关联,尽管它们永远不能长于数组,但它们可以更小。
?
?make?
? 函数还允许使用第三个参数:x := make([]float64, 3, 10)
10 表示切片指向的底层数组的容量:
package main
import "fmt"
func main() {
X := make([]float64, 3, 10)
fmt.Printf("Slice = %v", X)
fmt.Printf("\\nLength = %d", len(X))
fmt.Printf("\\nCapacity = %d", cap(X))
}
运行代码,得到:
Slice = [0 0 0]
Length = 3
Capacity = 10
切片的声明切片是一个可变长度的序列,它存储相似类型的元素,并且不允许在同一个切片中存储不同类型的元素。 切片中的第一个索引位置始终为 0,最后一个为(切片长度 - 1)。
另一种创建切片的方法是使用 ?
?[low : high]?
? 表达式:array := []float64{1, 2, 3, 4, 5}
x := array[0:5]
?
?low?
?? 是切片的起始索引, ??high?
? 是终止索引,但不包括该索引本身。例如: ?
?array[0:5]?
?? 返回 ??[1,2,3,4,5]?
?? 。 ??array[1:4]?
?? 得到 ??[2,3,4]?
? .为了方便,Go 语言允许省略 ?
?low?
?? , ??high?
?? ,甚至两个一起省略。- ?
?array[0:]?
?? 等同于 ??array[0:len(array)]?
? . ?array[:5] ?
?? 等同于 ??array[0:5]?
? .- ?
?array[:]?
?? 等同于 ??array[0:len(array)]?
?
package main
import "fmt"
func main() {
// Create a slice using a slice literal
var my_slices = []int{1, 2, 3, 4, 5}
fmt.Println("my_slices = ", my_slices)
// Create a slice using a slice literal using short hand declaration
my_slices2 := []int{6, 7, 8, 9, 10}
fmt.Println("my_slices2 = ", my_slices2)
}
切片的修改切片是引用类型,它们引用底层数组。 因此,修改切片的一个元素将修改引用数组中的相应元素,引用同一数组的其他切片也将看到这些修改。
package main
import "fmt"
func main() {
number_English := [7]string{"One", "Two", "Three", "Four", "Five", "Six", "Seven"}
slice1 := number_English[1:]
slice2 := number_English[3:]
fmt.Println("--- 修改前 ---")
fmt.Println("Array =", number_English)
fmt.Println("slice1 = ", slice1)
fmt.Println("slice2 = ", slice2)
// 修改切片
slice1[0] = "TWO"
slice1[2] = "FOUR"
slice2[1] = "FIVE"
fmt.Println("--- 修改后 ---")
fmt.Println("Array =", number_English)
fmt.Println("slice1 = ", slice1)
fmt.Println("slice2 = ", slice2)
}
运行后,结果为:
--- 修改前 ---
Array = [One Two Three Four Five Six Seven]
slice1 =[Two Three Four Five Six Seven]
slice2 =[Four Five Six Seven]
--- 修改后 ---
Array = [One TWO Three FOUR FIVE Six Seven]
slice1 =[TWO Three FOUR FIVE Six Seven]
slice2 =[FOUR FIVE Six Seven]
空值切片Nil slice 中不包含任何元素。 所以,这个切片的容量和长度都是 0。Nil 切片不包含数组引用。 让我们看看下面的例子:
package main
import "fmt"
func main() {
var nil_slices []string
fmt.Printf("Length of slice: %d\\n", len(nil_slices))
fmt.Printf("Capacity: %d\\n", cap(nil_slices))
}
运行结果为:
Length of slice: 0
Capacity: 0
切片是否为空
【Go 语言入门很简单 -- 7. Go Slices #私藏项目实操分享#】使用 ?
?==?
? 来检查切片是否为空,如:package main
import "fmt"
func main() {
x1 := []int{1, 2, 3, 4, 5, 6}
var x2 []int
fmt.Println(x1 ==推荐阅读
- 有关synchronized锁的知识点,我用一篇文章总结了
- SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClient(下)
- #yyds干货盘点# web安全day11(进一步学习windows域的gpo)
- 搞定大厂算法面试之leetcode精讲4.贪心
- 如何解决 ASP.NET Core 中的依赖问题
- 填坑总结(python内存泄漏排查小技巧)
- #yyds干货盘点#dart系列之:在dart中使用生成器
- 微服务治理之如何优雅应对突发流量洪峰
- zabbix监控系统性能优化(三十一)