ZetCode

Golang slices.Insert

最后修改于 2025 年 4 月 20 日

本教程将解释如何在 Go 中使用 `slices.Insert` 函数。我们将通过实际示例涵盖切片插入操作。

`slices.Insert` 函数在指定索引处将元素插入切片。它是 Go 实验性 slices 包的一部分。

此函数可用于通过在任何位置添加新元素来修改切片。它会返回一个包含插入元素的新切片。

基本的 slices.Insert 示例

`slices.Insert` 最简单的用法是在第 2 个位置添加一个元素。原始切片保持不变。

basic_insert.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    
    newNumbers := slices.Insert(numbers, 2, 99)
    
    fmt.Println("Original:", numbers)
    fmt.Println("Modified:", newNumbers)
}

我们创建一个数字切片,并在索引 2 处插入 99。新切片包含插入的元素,而原始切片保持不变。

插入多个元素

`slices.Insert` 可以一次插入多个元素。此示例在位置 1 处添加了三个字符串。

multiple_insert.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    fruits := []string{"apple", "banana", "cherry"}
    
    newFruits := slices.Insert(fruits, 1, "orange", "pear", "grape")
    
    fmt.Println("Original:", fruits)
    fmt.Println("Modified:", newFruits)
}

该函数接受要插入的元素的变长参数。所有元素都从指定的索引开始连续添加。

在开头插入

要在切片开头插入,请使用索引 0。此示例会预先添加元素。

prepend.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    letters := []string{"d", "e", "f"}
    
    newLetters := slices.Insert(letters, 0, "a", "b", "c")
    
    fmt.Println("Original:", letters)
    fmt.Println("Modified:", newLetters)
}

在索引 0 处插入有效地将元素添加到切片开头。原始切片保持不变。

插入到末尾

要追加元素,请使用切片长度作为索引。此示例将元素添加到末尾。

append_insert.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    colors := []string{"red", "green", "blue"}
    
    newColors := slices.Insert(colors, len(colors), "yellow", "purple")
    
    fmt.Println("Original:", colors)
    fmt.Println("Modified:", newColors)
}

使用 `len(slice)` 作为索引来追加元素。这等同于使用内置的 `append` 函数。

插入空切片

`slices.Insert` 可以与空切片一起使用。此示例演示了如何将元素插入 nil 切片。

empty_insert.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    var empty []int
    
    newSlice := slices.Insert(empty, 0, 10, 20, 30)
    
    fmt.Println("Original:", empty)
    fmt.Println("Modified:", newSlice)
}

将元素插入空切片会创建一个包含指定元素的新切片。即使在 nil 切片上使用索引 0,该操作也是有效的。

使用越界索引插入

尝试在切片长度之外插入会导致 panic。此示例显示了处理插入的安全方法。

bounds_check.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    data := []int{1, 2, 3}
    
    // Safe insertion
    if len(data) >= 5 {
        newData := slices.Insert(data, 5, 99)
        fmt.Println(newData)
    } else {
        fmt.Println("Cannot insert beyond slice length")
    }
    
    // Correct approach
    newData := slices.Insert(data, len(data), 99)
    fmt.Println("Safe insertion:", newData)
}

插入前始终检查切片边界。如果索引大于切片长度,函数将 panic。

实际示例:插入排序切片

此实际示例通过在正确的位置插入来维护排序的切片。它首先找到插入点。

sorted_insert.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    sorted := []int{10, 20, 30, 40, 50}
    newValue := 25
    
    // Find insertion point
    i, _ := slices.BinarySearch(sorted, newValue)
    
    // Insert at the correct position
    newSorted := slices.Insert(sorted, i, newValue)
    
    fmt.Println("Original:", sorted)
    fmt.Println("Modified:", newSorted)
}

我们使用 `slices.BinarySearch` 来查找插入新值的位置。这有效地维护了排序顺序。

来源

Go 实验性切片包文档

本教程通过在不同位置插入元素的实际示例,涵盖了 Go 中的 `slices.Insert` 函数。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 Go 教程