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
函数。