2012-09-07 11 views
57

Estoy intentando leer una línea completa desde la consola (incluidos los espacios en blanco), y luego procesarla. Usando bufio.ReadString, el carácter de nueva línea se lee conjuntamente con la entrada, por lo que le ocurrió el siguiente código para recortar el carácter de nueva línea:Extracción de subcadenas en Go

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

¿Hay una manera más idiomática para hacer esto? Es decir, ¿ya hay una biblioteca que se encarga del byte nulo final al extraer las subcadenas por usted?

(Sí, ya sé que ya hay una manera de leer una línea sin el carácter de nueva línea en go readline -> string pero estoy buscando más elegante para la manipulación de cadenas.)

Respuesta

70

Parece que usted está confundido por el trabajo de las rebanadas y el formato de almacenamiento de cadenas, que es diferente de lo que se tiene en C.

  • cualquier rebanada en las tiendas Va la longitud (en bytes), por lo que no hace falta que se preocupan por el costo de la len operación: no es necesario contar
  • Ir cadenas no son nulas termi nated, por lo que no tiene que eliminar un byte nulo, y no tiene que agregar 1 después de cortar agregando una cadena vacía.

para eliminar los últimos char (si se trata de un char un byte), sólo tiene que hacer

inputFmt:=input[0:len(input)-1] 

Y como notado por Uriel, se puede acortar de que como

cadenas
inputFmt:=input[:len(input)-1] 
+7

Ni siquiera necesita el 0 (o el :), 's = s [: len (s) -1]' funcionará. – uriel

+1

Muchas gracias por aclarar; parece que había dos caracteres en blanco al final de la cadena devueltos por la función ReadString, así que confundí uno con un byte nulo. Perdón por la confusión con C strings; Estaba usando fmt junto con bufio, lo que resultó en cosas divertidas que aparecían en la consola, así que pensé que podría ser el sucio byte nulo. Solo una aclaración final: ¿qué podría ser ese espacio en blanco adicional de ReadString? – mark2222

+0

Ok, responderé a mi propia pregunta: es \ r then \ n: P La salida de la consola graciosa fue porque publiqué \ r \ n sin \ n. – mark2222

14

Go están no terminó nulo, y para eliminar el último carácter de una cadena simplemente puede hacer:

s = s[:len(s)-1] 
+0

Esto es incorrecto y causará errores. Esto elimina el último * byte * de la cadena, lo que puede hacer que no sea válido UTF-8 (u otra codificación multibyte). –

+0

Consulte https://play.golang.org/p/K3HBBtj4Oi para ver un ejemplo de cómo se rompe esto. –

7

Para evitar el pánico en una entrada de longitud cero, envuelva la operación truncado en un caso

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