web-dev-qa-db-fra.com

Retourne le dernier élément des chaînes.Split () slice in Golang

Je suis fractionnement noms de fichiers dans Go pour obtenir l'extension de fichier (par exemple import ("strings") ; strings.Split("example.txt", ".")). Pour cette raison, je voudrais retourner le dernier élément de la tranche retournée par la division, c'est-à-dire.

pour strings.Split ("ex.txt", "."), je veux txt

This question suggère que faire

strings.Split("ex.txt", ".")[len(strings.Split("ex.txt", ".")) - 1]

est le seul moyen d'y arriver. Autrement dit, il n'y a pas de -1 comme en Python. Cela me semble très inutile, car je pense que nous effectuons deux fois la même opération de division.

  • N'y a-t-il pas de meilleure commande pour obtenir le dernier élément d'une tranche dans Go?
  • Si non, la meilleure approche serait-elle d'écrire le résultat de Split dans une variable, ou tout simplement de faire ce qui précède?

Je vous remercie!

9
patrick

Vous devez affecter les résultats du fractionnement à une variable, au lieu de l'appeler deux fois.

ss := strings.Split(msg, ".")
s := ss[len(ss)-1]

(Notez que cela vous permet (ou peut-être vous oblige) de traiter le cas où ss est vide ou autre chose inattendu de manière explicite, avant de l'indexer.)

Si vous faites cela encore et encore et que cela vous offense d'avoir à utiliser deux lignes (ou deux lignes plus la gestion des erreurs) au lieu d'une, vous pouvez la résumer assez facilement dans une fonction:

func lastString(ss []string) string {
    return ss[len(s)-1]
}

s1 := lastString(strings.Split("example.txt", "."))
s2 := lastString(strings.Split("example.jpg", "."))

Après tout, passer le résultat d'une fonction en tant qu'argument a essentiellement le même effet que de le lier à une variable.

9
abarnert

strings.LastIndex rend cela assez soigné:

s := "Hello,Stack,Overflow"
last := s[strings.LastIndex(s, ",")+1:]
fmt.Println(last)

renvoie "Overflow". Si la chaîne de recherche n'est pas trouvée, elle renvoie la chaîne entière, ce qui est logique.

Aire de jeux ici

7
Jon Egerton

J'utiliserais le package filepath plutôt que de l'analyser vous-même:

import "path/filepath"

s := "file.ext"
ext := filepath.Ext(s)
if len(ext) != 0 {
    fmt.Printf("ext = %s\n", ext[1:])
} else {
    fmt.Printf("no ext\n")
}

Cela fonctionnera avec un chemin d'accès complet ainsi qu'avec un nom de fichier.

5
hc6