77 votes

Comment supprimer le dernier caractère d'une chaîne en Golang ?

Je veux supprimer le tout dernier caractère d'une chaîne, mais avant de le faire je veux vérifier si le dernier caractère est un "+". Comment cela peut-il être fait ?

2 votes

La fonction intégrée est maintenant disponible. golang.org/pkg/strings/#TrimSuffix

72voto

peterSO Points 25725

Voici plusieurs façons de supprimer le(s) signe(s) plus en fin de chaîne.

package main

import (
    "fmt"
    "strings"
)

func TrimSuffix(s, suffix string) string {
    if strings.HasSuffix(s, suffix) {
        s = s[:len(s)-len(suffix)]
    }
    return s
}

func main() {
    s := "une chaîne ++"
    fmt.Println("s: ", s)

    // Supprimer un signe '+' en fin de chaîne.
    s1 := s
    if last := len(s1) - 1; last >= 0 && s1[last] == '+' {
        s1 = s1[:last]
    }
    fmt.Println("s1:", s1)

    // Supprimer tous les signes '+' en fin de chaîne.
    s2 := s
    s2 = strings.TrimRight(s2, "+")
    fmt.Println("s2:", s2)

    // Supprimer le suffixe "+".
    s3 := s
    s3 = TrimSuffix(s3, "+")
    fmt.Println("s3:", s3)
}

Résultat :

s:  une chaîne ++
s1: une chaîne +
s2: une chaîne 
s3: une chaîne +

3 votes

Pour toute personne consultant ceci maintenant, Go 1.1+ fournit strings.TrimSuffix.

43voto

utrecht Points 456

Basé sur le commentaire de @KarthikGR, l'exemple suivant a été ajouté :

https://play.golang.org/p/ekDeT02ZXoq

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.TrimSuffix("Foo++", "+"))
}

retourne :

Foo+

22voto

jimt Points 7028

Pas de moyen intégré. Mais c'est trivial à faire manuellement.

s := "mystring+"
sz := len(s)

if sz > 0 && s[sz-1] == '+' {
    s = s[:sz-1]
}

1 votes

Ne fonctionnera pas avec unicode, par exemple "mystring" play.golang.org/p/F0j19ceGo75. Je sais que la question originale demande de supprimer le "+", mais je suis venu ici en cherchant la réponse générale

2voto

Brian Sanchez Points 41
package main

import (
    "fmt"
)

func main() {

    s := "venga|ese|sabor|"

    newString := ""
    if len(s) > 0 {
        newString = s[:len(s)-1]
    }

    fmt.Println(newString)
}

output: venga|ese|sabor

go playground:
https://go.dev/play/p/o9ExIEuU0SF

-1voto

Shane Points 1

@llazzaro

Un simple coupeur de chaîne UTF conforme est

chaîne([]rune(foo)[:len(foo)-1]))

Donc je choisirais

f2 := []rune(foo)
for f2[len(f2)-1] == '+'{
    f2 = f2[:len(f2)-1]
}
foo = string(f2)

https://go.dev/play/p/anOwXlfQWaF

Je ne suis pas sûr pourquoi les autres réponses ont coupé de cette manière, car elles coupent des octets.

0 votes

Il est bon de souligner qu'il peut être important de gérer l'UTF-8. Cependant, votre premier exemple est bogué car la longueur en octets peut ne pas être la même que la longueur en runes. De plus, la question veut seulement savoir si la chaîne se termine par '+', pas enlever tous les '+' en fin de chaîne.

0 votes

@mpx Mon commentaire était en réponse à llazzaro, mais je ne pouvais pas répondre directement car je n'avais pas assez de points "Cependant, ton premier exemple est bogué car la longueur en octets peut ne pas être la même que la longueur en runes" - c'est pourquoi j'utilise des runes dans mon exemple ; une rune est composée de 1 à 3 octets, toutes les réponses utilisent des octets sauf la mienne, ce qui est correct si le dernier caractère à supprimer est un seul octet. "De plus, la question veut seulement savoir si la chaîne se termine par '+', pas supprimer tous les '+' en fin de chaîne" = toutes les réponses supposent que le '+' est supprimé.

0 votes

Je comprends la raison de la conversion de la rune, mais il y a toujours un bug. Essayez ce qui suit : foo := "\u2211\U0001f642+"; fmt.Printf("%q\n", string([]rune(foo)[:len(foo)-1])) Vous trouverez des NULL supplémentaires à la fin plutôt que la troncature. L'exemple prend la longueur en octets de la chaîne, soustrait 1, puis l'utilise pour trancher les runes, ce qui augmente la taille globale. En fonction de la longueur de la chaîne, cela pourrait également provoquer une panique. À ma connaissance, vous devriez pouvoir éditer votre réponse ici ?

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