web-dev-qa-db-fra.com

Extraire des sous-chaînes dans Go

J'essaie de lire une ligne entière à partir de la console (y compris les espaces), puis de la traiter. À l'aide de bufio.ReadString, le caractère de nouvelle ligne est lu en même temps que l'entrée. J'ai donc créé le code suivant pour découper le caractère de nouvelle ligne:

input,_:=src.ReadString('\n')
inputFmt:=input[0:len(input)-2]+"" //Need to manually add end of string

Y a-t-il un moyen plus idiomatique de faire cela? C'est-à-dire, existe-t-il déjà une bibliothèque qui s'occupe de l'octet nul final lors de l'extraction de sous-chaînes pour vous?

(Oui, je sais qu'il existe déjà un moyen de lire une ligne sans le caractère de nouvelle ligne dans go readline -> string mais je recherche davantage une manipulation élégante des chaînes.)

75
mark2222

Il semble que le fonctionnement des tranches et le format de stockage de la chaîne, qui diffère de ce que vous avez en C., vous déroutent.

  • toute tranche de Go stocke la longueur (en octets), de sorte que vous ne devez pas vous préoccuper du coût de l'opération len: il n'est pas nécessaire de compter
  • Les chaînes Go ne sont pas terminées par un octet nul, vous n'avez donc pas besoin de supprimer un octet nul ni d'ajouter 1 après le découpage en ajoutant une chaîne vide.

Pour supprimer le dernier caractère (s'il s'agit d'un caractère d'un octet), faites simplement

inputFmt:=input[:len(input)-1]
95
Denys Séguret

Les chaînes de caractères Go ne sont pas terminées par un caractère null, et pour supprimer le dernier caractère d'une chaîne, vous pouvez simplement faire:

s = s[:len(s)-1]
16
uriel

Pour éviter une panique sur une entrée de longueur nulle, encapsulez l'opération de tronquage dans un if

input, _ := src.ReadString('\n')
var inputFmt string
if len(input) > 0 {
    inputFmt = input[:len(input)-1]
}
// Do something with inputFmt
9
Rohanthewiz

Pour obtenir une sous-chaîne

  1. trouver la position de "sp"

  2. chaîne de coupe avec tableau logique

https://play.golang.org/p/0Redd_qiZM

2
TeeTracker

AVERTISSEMENT: les opérations sur les chaînes seules ne fonctionneront qu'avec ASCII et seront considérées comme fausses si la saisie est un caractère encodé en UTF-8 non-ASCII.

Voici une version compatible UTF-8:

func substr(input string, start int, length int) string {
    asRunes := []rune(input)

    if start >= len(asRunes) {
        return ""
    }

    if start+length > len(asRunes) {
        length = len(asRunes) - start
    }

    return string(asRunes[start : start+length])
}
0
joonas.fi

C’est le simple pour effectuer une sous-chaîne dans Go

package main

import "fmt"

var p = fmt.Println

func main() {

  value := "address;bar"

  // Take substring from index 2 to length of string
  substring := value[2:len(value)]
  p(substring)

}
0
Faris Rayhan