Как определить положение элемента в срезе?

Как определить положение элемента, присутствующего в срезе?

Мне нужно что-то вроде следующего:

type intSlice []int

func (slice intSlice) pos(value int) int {
    for p, v := range slice {
        if (v == value) {
            return p
        }
    }
    return -1
}

Ответ 1

Извините, для этой функции нет общей библиотеки. Go не имеет прямого способа записи функции, которая может работать на любом фрагменте.

Ваша функция работает, хотя было бы немного лучше, если бы вы написали ее с помощью range.

Если у вас есть байтовый срез, bytes.IndexByte.

Ответ 2

Вы можете создать общую функцию в идиоматическом режиме:

func SliceIndex(limit int, predicate func(i int) bool) int {
    for i := 0; i < limit; i++ {
        if predicate(i) {
            return i
        }
    }
    return -1
}

И использование:

xs := []int{2, 4, 6, 8}
ys := []string{"C", "B", "K", "A"}
fmt.Println(
    SliceIndex(len(xs), func(i int) bool { return xs[i] == 5 }),
    SliceIndex(len(xs), func(i int) bool { return xs[i] == 6 }),
    SliceIndex(len(ys), func(i int) bool { return ys[i] == "Z" }),
    SliceIndex(len(ys), func(i int) bool { return ys[i] == "A" }))

Ответ 3

Для этого нет никакой библиотечной функции. Вы должны сделать код самостоятельно.

Ответ 4

Другим вариантом является сортировка фрагмента с помощью пакета сортировки, затем поиск нужной вещи:

package main

import (
    "sort"
    "log"
    )

var ints = [...]int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586}

func main() {
        data := ints
        a := sort.IntSlice(data[0:])
        sort.Sort(a)
        pos := sort.SearchInts(a, -784)
        log.Println("Sorted: ", a)
        log.Println("Found at index ", pos)
}

печатает

2009/11/10 23:00:00 Sorted:  [-5467984 -784 0 0 42 59 74 238 905 959 7586 7586 9845]
2009/11/10 23:00:00 Found at index  1

Это работает для основных типов, и вы всегда можете реализовать интерфейс сортировки для своего собственного типа, если вам нужно работать с кусочком других вещей. См. http://golang.org/pkg/sort

В зависимости от того, что вы делаете,