2012-09-10 15 views

Respuesta

5

usar el paquete strings.

package main 

import (
    "fmt" 
    "strings" 
) 

func main() { 
    label := string([]byte{97, 98, 99, 0, 0, 0, 0}) 
    fmt.Println(strings.TrimSpace(label)) 
} 
+4

He usado 'strings.TrimRight (label," \ x00 ")', ¡gracias! – knarf

10

Tenga en cuenta que la primera respuesta solo funcionará con cadenas que solo tienen una ejecución de ceros después del terminador nulo; sin embargo, una secuencia terminada en nulo de estilo C termina en el primer \0, incluso si va seguida de basura. Por ejemplo, []byte{97,98,99,0,99,99,0} deben ser analizados como abc, no abc^@cc.

para analizar adecuadamente, utilice string.Index, de la siguiente manera, para encontrar el primera\0 y lo utilizan para cortar el original bytes cortes:

package main 

import (
    "fmt" 
    "strings" 
) 

func main() { 
    label := []byte{97,98,99,0,99,99,0} 
    s := label[:strings.Index(string(label), "\x00")] 
    fmt.Println(string(s)) 
} 

EDIT: Fue la impresión de la versión abreviada como []byte en lugar de como string. Gracias a @serbaut por la captura.

+2

Shouldnt que sea cadena (etiqueta [: bytes.IndexByte (etiqueta, 0)])? – serbaut

+0

@serbaut, estás en lo correcto; debería haber ejecutado eso en el juego, y me habría dado cuenta del formato de bytes []. Editado – azernik

6

Hay una función oculta en el interior del paquete de llamada al sistema de Go que encuentra el primer byte nulo ([] bytes {0}) y devuelve la longitud. Supongo que se llama clen para C-Length.

Siento un año de retraso en la respuesta, pero creo que es mucho más simple que los otros dos (no hay importaciones innecesarias, etc.)

func clen(n []byte) int { 
    for i := 0; i < len(n); i++ { 
     if n[i] == 0 { 
      return i 
     } 
    } 
    return len(n) 
} 

Así,

label := []byte{97, 98, 99, 0, 0, 0, 0} 
s := label[:clen(label)] 
fmt.Println(string(s)) 

lo que dice^es fijar s a la división de bytes en label desde el principio hasta el índice de clen(label).

El resultado sería abc con una longitud de 3.

+1

Esta es la solución más limpia, simple y eficiente. –

+1

Y, a diferencia de la respuesta 'string.Index', esto no va a entrar en pánico si el proporcionado [] byte'' * no * contiene un byte cero. –

0

La primera respuesta no funcionará !!

func TrimSpace(s []byte) []byte { 
    return TrimFunc(s, unicode.IsSpace) 
} 

func IsSpace(r rune) bool { 
    // This property isn't the same as Z; special-case it. 
    if uint32(r) <= MaxLatin1 { 
     switch r { 
     case '\t', '\n', '\v', '\f', '\r', ' ', 0x85, 0xA0: 
      return true 
     } 
     return false 
    } 
    return isExcludingLatin(White_Space, r) 
} 

no hay "\ x00" en func IsSpace en absoluto.

+0

ver el primer comentario de esa respuesta – knarf

+0

gracias, tienes razón. @knarf – wllenyj

Cuestiones relacionadas