2013-10-07 17 views
19

http://play.golang.org/p/ZsALO8oF3WGo, Golang: string dostęp jako wartość znaku

chcę przechodzić ciąg i zwracają wartości znakowych. Jak mogę, nie zwracać wartości liczbowych na każdą literę i zwracać rzeczywiste znaki?

Teraz jestem coraz to

0 72 72 
1 101 101 
2 108 108 
3 108 108 
4 111 111 

Moja pożądany wynik byłby

0 h h 
1 e e 
2 l l 
3 l l 
4 o o 

package main 

import "fmt" 

func main() { 

    str := "Hello" 
    for i, elem := range str { 
     fmt.Println(i, str[i], elem) 
    } 

    for elem := range str { 
     fmt.Println(elem) 
    } 
} 

Dzięki

Odpowiedz

41

For statements

Dla wartości ciągu, „zasięgu” iteracje klauzula ponad kodu Unicode punkty w ciąg bajtów zaczynając od indeksu 0. Na kolejnych iteracji, wartość indeksu będzie indeks pierwszego bajtu kolejnych kodowanych punktów kodowanych w UTF-8 w łańcuchu, a druga wartość runy typu będzie wartością odpowiedniego kodu punkt. Jeśli w iteracji wystąpi nieprawidłowa sekwencja UTF-8, drugą wartością będzie 0xFFFD, znak zastępczy Unicode i kolejna iteracja spowoduje przesunięcie pojedynczego bajtu w łańcuchu.

Na przykład

package main 

import "fmt" 

func main() { 
    str := "Hello" 
    for _, r := range str { 
     c := string(r) 
     fmt.Println(c) 
    } 
    fmt.Println() 
    for i, r := range str { 
     fmt.Println(i, r, string(r)) 
    } 
} 

wyjściowa:

H 
e 
l 
l 
o 

0 72 H 
1 101 e 
2 108 l 
3 108 l 
4 111 o 
1

jaki jesteś iteracja ciągu znaków w łańcuchu jest wykonalne (choć str [i] i elem są duplikatami nawzajem). Masz właściwe dane.

Aby uzyskać poprawne wyświetlanie, wystarczy wyprowadzić dane z odpowiednim formatowaniem (tzn. Zinterpretować je jako znak Unicode, a nie jako int).

Zmiana:

fmt.Println(i, str[i], elem) 

do:

fmt.Printf("%d %c %c\n", i, str[i], elem) 

%c jest znak reprezentowany przez odpowiedni punkt kodowy Unicode za doc printf: http://golang.org/pkg/fmt/

4

pakietu głównego Korzystanie printf aby wskazać, że chcesz drukować znaki.

import "fmt" 

func main() { 

     str := "Hello" 
     for i, elem := range str { 
       fmt.Printf("%d %c %c\n", i, str[i], elem) 
     } 

}