Go 切片实战指南

GolangGolangBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

实验(Slices lab)旨在测试你对 Go 语言中切片(slice)数据类型的了解。切片是一种比数组更强大的序列接口,本实验将帮助你理解如何使用它们。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("`Golang`")) -.-> go/DataTypesandStructuresGroup(["`Data Types and Structures`"]) go/DataTypesandStructuresGroup -.-> go/slices("`Slices`") subgraph Lab Skills go/slices -.-> lab-15506{{"`Go 切片实战指南`"}} end

切片

本实验要解决的问题是在 Go 语言中创建和操作切片。你需要创建一个长度不为零的空切片,在切片中设置和获取值,使用 len 函数获取切片的长度,使用 append 函数向切片中添加新值,使用 copy 函数复制切片,以及使用切片运算符从现有切片中获取一部分元素。

要完成本实验,你需要对 Go 语言的语法和切片数据类型有基本的了解。你还需要熟悉 makeappendcopy 函数,以及切片运算符。

## 请注意,虽然切片与数组是不同的类型,
## 但 `fmt.Println` 对它们的呈现方式类似。
$ go run slices.go
emp: [ ]
set: [a b c]
get: c
len: 3
apd: [a b c d e f]
cpy: [a b c d e f]
sl1: [c d e]
sl2: [a b c d e]
sl3: [c d e f]
dcl: [g h i]
2d: [[0] [1 2] [2 3 4]]

## 查看 Go 团队的这篇 [精彩博客文章](https://go.dev/blog/slices-intro),
## 以获取有关 Go 语言中切片设计和实现的更多详细信息。

## 既然我们已经了解了数组和切片,接下来我们将看看
## Go 语言的另一个关键内置数据结构:映射。

以下是完整代码:

// 切片是 Go 语言中的一种重要数据类型,它为序列提供了比数组更强大的接口。

package main

import "fmt"

func main() {

	// 与数组不同,切片仅由它们包含的元素类型(而非元素数量)来定义类型。
	// 要创建一个长度不为零的空切片,请使用内置的 `make` 函数。
	// 这里我们创建一个长度为 `3` 的 `string` 类型切片(初始值为零值)。
	s := make([]string, 3)
	fmt.Println("emp:", s)

	// 我们可以像操作数组一样设置和获取切片中的元素。
	s[0] = "a"
	s[1] = "b"
	s[2] = "c"
	fmt.Println("set:", s)
	fmt.Println("get:", s[2])

	// `len` 函数按预期返回切片的长度。
	fmt.Println("len:", len(s))

	// 除了这些基本操作外,切片还支持一些其他操作,这使得它们比数组更丰富。
	// 其中一个是内置的 `append` 函数,它返回一个包含一个或多个新值的切片。
	// 请注意,我们需要接受 `append` 的返回值,因为我们可能会得到一个新的切片值。
	s = append(s, "d")
	s = append(s, "e", "f")
	fmt.Println("apd:", s)

	// 切片也可以被复制。这里我们创建一个与 `s` 长度相同的空切片 `c`,并将 `s` 复制到 `c` 中。
	c := make([]string, len(s))
	copy(c, s)
	fmt.Println("cpy:", c)

	// 切片支持一种 “切片” 运算符,语法为 `slice[low:high]`。
	// 例如,这将获取元素 `s[2]`、`s[3]` 和 `s[4]` 组成的切片。
	l := s[2:5]
	fmt.Println("sl1:", l)

	// 这将切片到(但不包括)`s[5]`。
	l = s[:5]
	fmt.Println("sl2:", l)

	// 这将从(并包括)`s[2]` 开始切片。
	l = s[2:]
	fmt.Println("sl3:", l)

	// 我们也可以在一行中声明并初始化一个切片变量。
	t := []string{"g", "h", "i"}
	fmt.Println("dcl:", t)

	// 切片可以组成多维数据结构。与多维数组不同,内部切片的长度可以不同。
	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)
}

总结

实验(Slices lab)旨在测试你对 Go 语言中切片(slice)数据类型的了解。通过完成本实验,你将更好地理解如何在 Go 语言中创建和操作切片,包括如何在切片中设置和获取值、使用 len 函数、使用 appendcopy 函数以及使用切片运算符。

您可能感兴趣的其他 Golang 教程