2013-06-05 4 views
5

Ho dividere una stringa da spazi:Qual è la differenza tra [0] e [: 1] in Go?

splstr = strings.Split(str, " ") 

Poi ho iterare ogni parola, e guardo il primo carattere in questo modo:

splstr[i][0] == "#" 

ma ho avuto questi errori da quella linea:

...: impossibile convertire "#" per digitare uint8

...: operazione non valida: splstr [i] [ 0] == "#" (tipi non corrispondenti uint8 e ad arco)

Ma poi ho impiombato che:

splstr[i][:1] == "#" 

e che funziona. Capisco perché [:1] è di tipo string, ma perché è [0] di tipo uint8? (Sto usando Go 1.1.)

+1

'splstr [i] [0] == '# ''è valido (annota le virgolette singole). Stai indicizzando i caratteri della stringa, che a loro volta non sono stringhe –

risposta

10

Poiché la notazione di matrice su una stringa dà accesso a byte della stringa, come documentato nella specifica lingua:

http://golang.org/ref/spec#String_types

byte di una stringa può essere accesso da indici interi da 0 a len (s) -1.

(byte è un alias per uint8)

3

[x:x] ([:x] è una forma di [0:x]) taglierà una sezione in un'altra fetta mentre [x] sarà recuperare l'oggetto all'indice x. La differenza è la seguente:

arr := "#####" 
fmt.Println(arr[:1]) // will print out a string 
fmt.Println(arr[0]) // will print out a byte 

Se il string viene convertito in []byte:

arr := []byte("#####") 
fmt.Println(arr[:1]) // will print out a slice of bytes 
fmt.Println(arr[0]) // will print out a byte 

si può provare voi stessi a http://play.golang.org/p/OOZQqXTaYK