2012-09-10 7 views

Odpowiedz

5

użyciu pakietu strings.

package main 

import (
    "fmt" 
    "strings" 
) 

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

Użyłem 'stringów.TrimRight (label," \ x00 ")', dzięki! – knarf

10

Zauważ, że pierwsza odpowiedź będzie działać tylko z łańcuchów, które mają tylko serię zer po zerowej terminatora; jednakże prawidłowy łańcuch zakończony znakiem C kończy się na pierwszym \0, nawet jeśli następuje po nim śmieci. Na przykład []byte{97,98,99,0,99,99,0} należy przeanalizować jako , a nie abc^@cc.

Aby poprawnie analizować to, użyj string.Index, w następujący sposób, aby znaleźć pierwszy\0 i używać go kroić oryginalny bajt kawałek:

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: Czy drukowanie skróconej wersji jako []byte zamiast jako string. Dzięki @serbaut za połów.

+2

Nie powinien to być ciąg (label [: bytes.IndexByte (label, 0)])? – serbaut

+0

@serbaut, masz całkowitą rację; powinien uruchomić to w grze i zauważyłbym formatowanie bajtów []. Edytowane – azernik

6

Ta funkcja jest ukryta w pakiecie syscall Go, która znajduje pierwszy bajt zerowy ([] Bajt {0}) i zwraca jego długość. Zakładam, że nazywa się clen dla C-Length.

Niestety jestem rok późno na tej odpowiedzi, ale myślę, że to dużo prostsze niż dwóch pozostałych (bez zbędnych importu, itp)

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

Więc

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

To, co^mówi, to ustawić s na kawałek bajtów w label od początku do indeksu clen(label).

Wynik byłby abc o długości 3.

+1

Jest to w rzeczywistości najczystsze, najprostsze i bardziej wydajne rozwiązanie. –

+1

I, w przeciwieństwie do odpowiedzi 'string.Index', nie będzie panikuj, jeśli podany bajt' [] nie * zawiera * zero bajtów. –

0

Pierwsza odpowiedź nie będzie działać !!

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) 
} 

Nie ma "\ x00" w func IsSpace w ogóle.

+0

zobacz pierwszy komentarz tej odpowiedzi – knarf

+0

dziękuję, masz rację. @knarf – wllenyj

Powiązane problemy