web-dev-qa-db-fra.com

Comment supprimer le premier caractère d'une chaîne?

Quelle est la méthode suggérée pour supprimer le premier caractère d'une chaîne?

J'ai parcouru la documentation pour les méthodes de chaîne mais je ne vois rien qui fonctionne comme le javascript String.slice () .

10
Quentin Gibson

En supposant que la question utilise "caractère" pour faire référence à ce que Go appelle un rune , puis utilisez tf8.DecodeRuneInString pour obtenir la taille de la première rune, puis tranche:

func trimFirstRune(s string) string {
    _, i := utf8.DecodeRuneInString(s)
    return s[i:]
}

exemple de terrain de je

Comme le démontre peterSO dans l'exemple de la cour de récréation lié à son commentaire, la plage sur une chaîne peut également être utilisée pour trouver où se termine la première rune:

func trimFirstRune(s string) string {
    for i := range s {
        if i > 0 {
            // The value i is the index in s of the second 
            // rune.  Slice to remove the first rune.
            return s[i:]
        }
    }
    // There are 0 or 1 runes in the string. 
    return ""
}
11
Cerise Limón

Dans Go, les caractères string sont des points de code Unicode encodés en UTF-8. UTF-8 est un codage de longueur variable.

La spécification du langage de programmation Go

Pour les déclarations

Pour les instructions avec clause range

Pour une valeur de chaîne, la clause "range" itère sur les points de code Unicode de la chaîne à partir de l'index d'octets 0. Lors d'itérations successives, la valeur d'index sera l'index du premier octet de points de code codés UTF-8 successifs dans la chaîne et la deuxième valeur, de type rune, seront la valeur du point de code correspondant. Si l'itération rencontre une séquence UTF-8 non valide, la deuxième valeur sera 0xFFFD, le caractère de remplacement Unicode, et l'itération suivante avancera d'un seul octet dans la chaîne.

Par exemple,

package main

import "fmt"

func trimLeftChar(s string) string {
    for i := range s {
        if i > 0 {
            return s[i:]
        }
    }
    return s[:0]
}

func main() {
    fmt.Printf("%q\n", "Hello, 世界")
    fmt.Printf("%q\n", trimLeftChar(""))
    fmt.Printf("%q\n", trimLeftChar("H"))
    fmt.Printf("%q\n", trimLeftChar("世"))
    fmt.Printf("%q\n", trimLeftChar("Hello"))
    fmt.Printf("%q\n", trimLeftChar("世界"))
}

Aire de jeux: https://play.golang.org/p/t93M8keTQP_I

Sortie:

"Hello, 世界"
""
""
""
"Ello"
"界"

Ou, pour une fonction plus générale,

package main

import "fmt"

func trimLeftChars(s string, n int) string {
    m := 0
    for i := range s {
        if m >= n {
            return s[i:]
        }
        m++
    }
    return s[:0]
}

func main() {
    fmt.Printf("%q\n", trimLeftChars("", 1))
    fmt.Printf("%q\n", trimLeftChars("H", 1))
    fmt.Printf("%q\n", trimLeftChars("世", 1))
    fmt.Printf("%q\n", trimLeftChars("Hello", 1))
    fmt.Printf("%q\n", trimLeftChars("世界", 1))
    fmt.Println()
    fmt.Printf("%q\n", "Hello, 世界")
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 0))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 1))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 7))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 8))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 9))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 10))
}

Aire de jeux: https://play.golang.org/p/ECAHl2FqdhR

Sortie:

""
""
""
"Ello"
"界"

"Hello, 世界"
"Hello, 世界"
"Ello, 世界"
"世界"
"界"
""
""

Les références:

La spécification du langage de programmation Go

FAQ Unicode UTF-8

Le consortium Unicode

14
peterSO

Cela fonctionne pour moi:

package main

import "fmt"

func main() {
    input := "abcd"
    fmt.Println(input[1:])    
}

La sortie est:

bcd

Code sur Go Playground: https://play.golang.org/p/iTV7RpML3LO

1
Vikram Hosakote