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 () .
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:]
}
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 ""
}
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 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:
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