ZetCode

Golang slices.Replace

最后修改于 2025 年 4 月 20 日

本教程解释了如何在 Go 中使用 slices.Replace 函数。我们将通过替换元素的实际示例来介绍切片操作。

slices.Replace 函数用新元素替换切片中的元素。它是 Go 实验性 slices 包的一部分。

此函数可用于修改切片而不创建新切片。它可以替换零个或多个元素,替换为零个或多个新元素。

基本 slices.Replace 示例

slices.Replace 最简单的用法是用一个元素替换另一个元素。我们指定要替换的元素的起始和结束索引。

basic_replace.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    
    // Replace element at index 2 (value 3) with 99
    newNumbers := slices.Replace(numbers, 2, 3, 99)
    
    fmt.Println("Original:", numbers)
    fmt.Println("Modified:", newNumbers)
}

我们用新值 (99) 替换一个元素(索引 2)。原始切片保持不变,并返回一个新切片。

替换多个元素

slices.Replace 可以一次替换多个元素。此示例用三个新值替换两个元素。

multiple_replace.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    colors := []string{"red", "green", "blue", "yellow"}
    
    // Replace elements at index 1-2 with three new colors
    newColors := slices.Replace(colors, 1, 3, "orange", "purple", "cyan")
    
    fmt.Println("Original:", colors)
    fmt.Println("Modified:", newColors)
}

我们将“green”和“blue”替换为三种新颜色。由于我们添加的元素多于删除的元素,因此切片长度增加了 1。

替换为零个元素

我们可以使用 slices.Replace 通过将其替换为空来有效地删除元素。这会在不留下间隙的情况下删除元素。

delete_elements.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    data := []int{10, 20, 30, 40, 50, 60}
    
    // Remove elements at index 2-4 (30, 40, 50)
    newData := slices.Replace(data, 2, 5)
    
    fmt.Println("Original:", data)
    fmt.Println("Modified:", newData)
}

通过不提供替换值,我们有效地删除了指定的范围。结果切片比原始切片短。

插入而不替换

通过使用相等的起始和结束索引,slices.Replace 可以插入元素而不替换任何元素。此示例演示了插入。

insert_elements.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    letters := []string{"a", "b", "c", "d"}
    
    // Insert at index 2 without replacing any elements
    newLetters := slices.Replace(letters, 2, 2, "x", "y", "z")
    
    fmt.Println("Original:", letters)
    fmt.Println("Modified:", newLetters)
}

我们在位置 2 处插入三个新元素,而不删除任何元素。结果切片长度增加了 3。

边缘情况:空切片

slices.Replace 可以很好地处理空切片。此示例显示了如何从空切片构建切片。

empty_slice.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    var empty []int
    
    // Build a new slice by replacing in empty slice
    newSlice := slices.Replace(empty, 0, 0, 1, 2, 3)
    
    fmt.Println("Original:", empty)
    fmt.Println("Modified:", newSlice)
}

我们从一个空切片开始,然后插入三个元素。该函数按预期工作,创建一个包含指定值的新切片。

替换结构体元素

slices.Replace 可与自定义结构体类型配合使用。此示例演示了在切片中替换结构体值。

struct_replace.go
package main

import (
    "fmt"
    "slices"
)

type Point struct {
    X, Y int
}

func main() {
    points := []Point{
        {1, 2},
        {3, 4},
        {5, 6},
    }
    
    // Replace the middle point with two new points
    newPoints := slices.Replace(points, 1, 2, Point{7, 8}, Point{9, 10})
    
    fmt.Println("Original:", points)
    fmt.Println("Modified:", newPoints)
}

我们将一个 Point 结构体替换为两个新的结构体。该函数对自定义类型的处理与内置类型一样好。

实际示例:更新记录

这个实际示例展示了如何在切片中更新记录。我们用当前条目替换过时的条目。

update_records.go
package main

import (
    "fmt"
    "slices"
)

type Product struct {
    ID    int
    Name  string
    Price float64
}

func main() {
    products := []Product{
        {1, "Laptop", 999.99},
        {2, "Phone", 699.99},
        {3, "Tablet", 399.99},
    }
    
    // Update prices for products with ID 2 and 3
    updated := slices.Replace(products, 1, 3,
        Product{2, "Phone", 649.99},
        Product{3, "Tablet", 349.99},
    )
    
    fmt.Println("Original products:")
    for _, p := range products {
        fmt.Printf("%d: %s $%.2f\n", p.ID, p.Name, p.Price)
    }
    
    fmt.Println("\nUpdated products:")
    for _, p := range updated {
        fmt.Printf("%d: %s $%.2f\n", p.ID, p.Name, p.Price)
    }
}

我们用更新的价格信息替换了两个产品。该示例演示了 Replace 函数的实际用例。

来源

Go 实验性切片包文档

本教程通过在各种场景下替换切片元素的实际示例,介绍了 Go 中的 slices.Replace 函数。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 Go 教程