118 votes

Go: comment connaître la position de l'élément dans la tranche?

Désolé, la question peut sembler idiote, mais je ne trouve pas de méthode standard pour déterminer la position d’un élément dans la tranche.

J'ai besoin de quelque chose comme ça:

 type intSlice []int

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

UPD: code fixe pour être plus idiomatique :)

74voto

Evan Shaw Points 7957

Désolé, il n'y a pas de fonction de bibliothèque générique pour faire cela. Go n'a pas de méthode simple pour écrire une fonction qui peut fonctionner sur n'importe quelle tranche.

Votre fonction fonctionne, même si ce serait un peu mieux si vous l’écriviez en utilisant range .

Si vous avez une tranche d'octet, il y a bytes.IndexByte .

59voto

hodzanassredin Points 396

Vous pouvez créer une fonction générique de façon idiomatique:

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

Et utilisation:

 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" }))
 

9voto

alessandro Points 497

Il n'y a pas de fonction de bibliothèque pour cela. Vous devez coder vous-même.

1voto

robothor Points 141

Une autre option consiste à trier la tranche à l'aide du package de tri, puis à rechercher l'élément recherché:

 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)
}
 

empreintes

 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
 

Cela fonctionne pour les types de base et vous pouvez toujours implémenter l'interface de tri pour votre propre type si vous devez travailler sur une autre tranche. Voir http://golang.org/pkg/sort

Cela dépend de ce que vous faites cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X