ZetCode

Golang slices.Repeat

最后修改于 2025 年 4 月 20 日

本教程将介绍如何在 Go 中使用 slices.Repeat 函数。我们将通过创建重复元素的实际示例来讲解切片操作。

slices.Repeat 函数通过将给定元素重复指定次数来创建一个新切片。它是 Go 实验性 slices 包的一部分。

此函数可用于使用重复值初始化切片或创建模式。它会返回一个新切片,其中包含重复 count 次的元素。

基本的 slices.Repeat 示例

slices.Repeat 最简单的用法是创建一个包含重复零的切片。我们指定要重复的元素和重复次数。

basic_repeat.go
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" 字符串的切片。

string_repeat.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    greetings := slices.Repeat("hello", 3)
    fmt.Println("Greetings:", greetings)
}

该函数将字符串 "hello" 重复三次。结果是一个包含 ["hello", "hello", "hello"] 的切片。

使用结构体

我们可以将 slices.Repeat 与自定义结构体类型一起使用。此示例创建了 Person 结构体的多个实例。

struct_repeat.go
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 会通过返回一个空切片来处理负数计数。此示例演示了无效计数的行为。

negative_count.go
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 会返回一个空切片。此示例显示了零计数和正计数之间的区别。

zero_count.go
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 会创建一个单元素切片。两者都是有效的,但代表不同的概念。

性能注意事项

对于大计数重复,内存分配变得很重要。此示例对不同重复大小进行了基准测试。

performance.go
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 来初始化一个带有默认值的游戏棋盘。我们创建了一个表示棋盘的二维切片。

game_board.go
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 实验性切片包文档

本教程通过在各种场景下创建重复切片元素的实际示例,介绍了 Go 中的 slices.Repeat 函数。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程