Golang slices.Repeat
最后修改于 2025 年 4 月 20 日
本教程将介绍如何在 Go 中使用 slices.Repeat 函数。我们将通过创建重复元素的实际示例来讲解切片操作。
slices.Repeat 函数通过将给定元素重复指定次数来创建一个新切片。它是 Go 实验性 slices 包的一部分。
此函数可用于使用重复值初始化切片或创建模式。它会返回一个新切片,其中包含重复 count 次的元素。
基本的 slices.Repeat 示例
slices.Repeat 最简单的用法是创建一个包含重复零的切片。我们指定要重复的元素和重复次数。
package main
import (
"fmt"
"slices"
)
func main() {
repeated := slices.Repeat(0, 5)
fmt.Println("Repeated zeros:", repeated)
}
我们创建了一个包含五个零的切片。第一个参数是要重复的值,第二个参数是重复次数。输出显示为 [0 0 0 0 0]。
重复字符串
slices.Repeat 可以创建包含重复字符串的切片。此示例创建一个包含三个 "hello" 字符串的切片。
package main
import (
"fmt"
"slices"
)
func main() {
greetings := slices.Repeat("hello", 3)
fmt.Println("Greetings:", greetings)
}
该函数将字符串 "hello" 重复三次。结果是一个包含 ["hello", "hello", "hello"] 的切片。
使用结构体
我们可以将 slices.Repeat 与自定义结构体类型一起使用。此示例创建了 Person 结构体的多个实例。
package main
import (
"fmt"
"slices"
)
type Person struct {
Name string
Age int
}
func main() {
defaultPerson := Person{"Unknown", 0}
people := slices.Repeat(defaultPerson, 2)
fmt.Println("People:", people)
}
我们定义了一个 Person 结构体,并创建了一个默认实例的两个副本。结果切片中的每个元素都是结构体的一个单独副本。
负数计数处理
slices.Repeat 会通过返回一个空切片来处理负数计数。此示例演示了无效计数的行为。
package main
import (
"fmt"
"slices"
)
func main() {
// Valid count
positive := slices.Repeat(1, 3)
fmt.Println("Positive count:", positive)
// Negative count
negative := slices.Repeat(1, -1)
fmt.Println("Negative count:", negative)
}
当计数为正时,我们会得到预期的重复元素。当计数为负时,函数会返回一个空切片,而不会发生恐慌。
零计数行为
当 count 为零时,slices.Repeat 会返回一个空切片。此示例显示了零计数和正计数之间的区别。
package main
import (
"fmt"
"slices"
)
func main() {
empty := slices.Repeat("test", 0)
fmt.Println("Empty slice:", empty, "Length:", len(empty))
nonEmpty := slices.Repeat("test", 1)
fmt.Println("Non-empty slice:", nonEmpty, "Length:", len(nonEmpty))
}
计数为零会产生一个空切片,而计数为 1 会创建一个单元素切片。两者都是有效的,但代表不同的概念。
性能注意事项
对于大计数重复,内存分配变得很重要。此示例对不同重复大小进行了基准测试。
package main
import (
"fmt"
"slices"
"time"
)
func main() {
start := time.Now()
small := slices.Repeat(1, 100)
_ = small
fmt.Println("Small slice:", time.Since(start))
start = time.Now()
large := slices.Repeat(1, 1_000_000)
_ = large
fmt.Println("Large slice:", time.Since(start))
}
执行时间随 count 参数而扩展。内存分配一次性完成,适用于整个切片,使其对于大计数也很高效。
实际示例:初始化游戏棋盘
这个实际示例使用 slices.Repeat 来初始化一个带有默认值的游戏棋盘。我们创建了一个表示棋盘的二维切片。
package main
import (
"fmt"
"slices"
)
func main() {
const width, height = 5, 5
const emptyCell = "."
// Create one row
row := slices.Repeat(emptyCell, width)
// Create board by repeating rows
board := slices.Repeat(row, height)
// Print the board
for _, row := range board {
fmt.Println(row)
}
}
我们首先创建一行空单元格,然后重复该行以构成棋盘。这展示了如何使用重复的切片构建复杂的结构。
来源
本教程通过在各种场景下创建重复切片元素的实际示例,介绍了 Go 中的 slices.Repeat 函数。