ZetCode

Golang slices.Index

最后修改于 2025 年 4 月 20 日

本教程将介绍如何在 Go 中使用 slices.Index 函数。我们将通过实际示例涵盖切片搜索操作。

slices.Index 函数返回一个值在切片中第一次出现时的索引。它是 Go 实验性 slices 包的一部分。

此函数对于在集合中查找元素非常有用。如果切片中未找到该值,则返回 -1。

基本的 slices.Index 示例

slices.Index 最简单的用法是在整数切片中查找数字。我们在一个小切片中搜索值 3。

basic_index.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    
    idx := slices.Index(numbers, 3)
    
    fmt.Println("Index of 3:", idx)
}

我们创建一个数字切片并搜索值 3。由于切片索引从 0 开始,该函数返回 2。

在切片中查找字符串

slices.Index 可以搜索字符串元素。此示例在水果切片中查找 "banana" 的位置。

string_index.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    fruits := []string{"apple", "banana", "cherry", "date"}
    
    idx := slices.Index(fruits, "banana")
    
    fmt.Println("Index of banana:", idx)
}

该函数搜索切片,并为 "banana" 返回 1。在 Go 中,字符串比较是区分大小写的。

搜索结构体值

我们可以将 slices.Index 用于自定义结构体类型。此示例在切片中查找特定人员。

struct_index.go
package main

import (
    "fmt"
    "slices"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    people := []Person{
        {"Alice", 25},
        {"Bob", 30},
        {"Charlie", 17},
    }
    
    target := Person{"Bob", 30}
    idx := slices.Index(people, target)
    
    fmt.Println("Index of Bob:", idx)
}

该函数比较所有结构体字段。它为 Bob 的记录返回 1,因为姓名和年龄都完全匹配。

处理未找到的情况

当未找到值时,slices.Index 返回 -1。此示例演示了此行为。

not_found.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    colors := []string{"red", "green", "blue"}
    
    idx := slices.Index(colors, "yellow")
    
    if idx == -1 {
        fmt.Println("Color not found")
    } else {
        fmt.Println("Color found at index:", idx)
    }
}

我们搜索切片中不存在的 "yellow"。函数返回 -1,我们通过条件检查来处理这种情况。

在空切片中搜索

slices.Index 对空切片返回 -1。此示例显示了对空字符串切片的操作。

empty_slice.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    var empty []string
    
    idx := slices.Index(empty, "test")
    
    fmt.Println("Index in empty slice:", idx)
}

由于没有要搜索的元素,函数立即返回 -1。这是空集合的预期行为。

性能注意事项

对于大型切片,搜索性能是线性的。此示例对大型切片中的搜索时间进行了基准测试。

performance.go
package main

import (
    "fmt"
    "slices"
    "time"
)

func main() {
    largeSlice := make([]int, 1_000_000)
    for i := range largeSlice {
        largeSlice[i] = i
    }
    
    // Search for first element
    start := time.Now()
    _ = slices.Index(largeSlice, 0)
    fmt.Println("First element search:", time.Since(start))
    
    // Search for last element
    start = time.Now()
    _ = slices.Index(largeSlice, 999_999)
    fmt.Println("Last element search:", time.Since(start))
}

执行时间因元素位置而异。查找靠前的元素比搜索末尾的元素更快。

实际示例:检查重复项

此实际示例使用 slices.Index 来检查切片中的重复值。

duplicates.go
package main

import (
    "fmt"
    "slices"
)

func hasDuplicates(slice []int) bool {
    for i, v := range slice {
        if slices.Index(slice[i+1:], v) != -1 {
            return true
        }
    }
    return false
}

func main() {
    numbers := []int{1, 2, 3, 4, 5, 2}
    
    if hasDuplicates(numbers) {
        fmt.Println("Slice contains duplicates")
    } else {
        fmt.Println("All elements are unique")
    }
}

我们将每个元素与剩余的切片部分进行比较。当找到任何重复值时,函数返回 true。

来源

Go 实验性切片包文档

本教程通过实际示例介绍了 Go 中的 slices.Index 函数,演示了如何在各种类型的切片中查找元素。

作者

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

列出所有 Go 教程