go example 9: Slices

本文详细介绍了Golang语言中的切片,包括其定义、与数组的区别、创建方法、长度和容量管理,以及append、copy等操作。还探讨了`slices`包在处理切片时的实用功能和一个多维切片的例子。

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
}

此内容超出内章节知识点,感兴趣可以等博主持续更新讲讲,今天主要讲切片基本用法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值