golang中的切片是重要的数据类型,比数组更强大。
package main
import (
"fmt"
"golang.org/x/exp/slices"
)
func main() {
var s []string
// 与数组不同,切片定义只包含类型,不用包含元素个数。未初始化的切片是空nil,长度是0
fmt.Println("unint:", s, s == nil, len(s) == 0)
// print
// unint: [] true true
// 创建非空的切片需要用到make。此处定义了字符串切片长度是3,初始化是默认值值
// 切片的容量capacity等于切片的长度length;如果一开始就知道切片需要多大地方存储元素,可以设置capacity参数(是make的第三个参数)给make函数。
s = make([]string, 3)
fmt.Println("emp:", s, "len:", len(s), "cap:", cap(s))
// print
// emp: [ ] len: 3 cap: 3
// 像操作数组一样给切片赋值
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("set:", s)
// print
// set: [a b c]
fmt.Println("get:", s[2])
// print
// get: c
fmt.Println("len:", len(s))
// print
// len: 3
// 切片比数组支持更多操作。一个就是append函数,此函数返回包含一个或多个元素的切片。请注意,我们需要接收返回值作为新的切片
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println("apd:", s)
// print
// apd: [a b c d e f]
// 切片可以被复制。创建个空切片c,长度和s一样,并且把s的内容copy到c。
c := make([]string, len(s))
copy(c, s)
fmt.Println("cpy:", c)
// print
// cpy: [a b c d e f]
// 切片支持一些独有的操作,slice[low:length],包含头不包含尾,一般函数都这个设计的。下面例子可以获取到s[2],s[3],s[4]。
l := s[2:5]
fmt.Println("sl1:", l)
// print
// sl1: [c d e]
// 这个切片从头取到s[5](不包含s[5])
l = s[:5]
fmt.Println("sl2:", l)
// print
// sl2: [a b c d e]
// 从s[2]开始切。包含s[2]
l = s[2:]
fmt.Println("sl3:", l)
// print
// sl3: [c d e f]
// 可以用一行定义和初始化切片。
t := []string{"g", "h", "i"}
fmt.Println("dcl:", t)
// print
// dcl: [g h i]
// slices包里面有很多有用的函数
t2 := []string{"g", "h", "i"}
if slices.Equal(t, t2) {
fmt.Println("t == t2")
}
// print
// t == t2
// 切片可以定义多个维度。里面的长度是可变的,不像多维数组。
twoD := make([][]int, 3)
for i := 0; i < 3; i++ {
innerLen := i + 1
twoD[i] = make([]int, innerLen)
for j := 0; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d:", twoD)
// print
// 2d: [[0] [1 2] [2 3 4]]
}
每一行代码解释看注释,没有分开写,直接copy到编辑器就可以运行,自己调试学习。
如果没有slices包的可以按照我自己的解决方式。我的golang是1.19的,没有自带的slices包。
找到go src目录

在下面创建golang.org/x 文件夹,自己git clone下载包代码。
git clone https://github.com/golang/exp.git
如果就是不能引入这个包,看源码放到项目下。
func Equal[S ~[]E, E comparable](s1, s2 S) bool {
if len(s1) != len(s2) {
return false
}
for i := range s1 {
if s1[i] != s2[i] {
return false
}
}
return true
}
此内容超出内章节知识点,感兴趣可以等博主持续更新讲讲,今天主要讲切片基本用法。
本文详细介绍了Golang语言中的切片,包括其定义、与数组的区别、创建方法、长度和容量管理,以及append、copy等操作。还探讨了`slices`包在处理切片时的实用功能和一个多维切片的例子。

被折叠的 条评论
为什么被折叠?



