Go, Golang: строка доступа как значение символа
http://play.golang.org/p/ZsALO8oF3W
Я хочу пересечь строку и вернуть значения символов. Как я могу, не возвращать числовые значения для каждой буквы и возвращать действительные символы?
Теперь я получаю это
0 72 72
1 101 101
2 108 108
3 108 108
4 111 111
Мой желаемый результат был бы
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)
}
}
Спасибо,
Ответы
Ответ 1
Для утверждений
Для строкового значения предложение "range" выполняет итерацию по коду Unicode точек в строке, начинающейся с индекса байта 0. На последовательном итераций, значение индекса будет индексом первого байта последовательные кодовые точки с кодировкой UTF-8 в строке, а вторая value, типа rune, будет значением соответствующего кода точка. Если итерация встречает недействительную последовательность UTF-8, второе значение будет 0xFFFD, символ замены Unicode и следующая итерация будет продвигать один байт в строке.
Например,
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))
}
}
Вывод:
H
e
l
l
o
0 72 H
1 101 e
2 108 l
3 108 l
4 111 o
Ответ 2
основной пакет
Используйте Printf, чтобы указать, что вы хотите печатать символы.
import "fmt"
func main() {
str := "Hello"
for i, elem := range str {
fmt.Printf("%d %c %c\n", i, str[i], elem)
}
}
Ответ 3
То, как вы выполняете итерации над символами в строке, является выполнимым (хотя str [i] и elem являются дублирующими друг друга). У вас есть правильные данные.
Чтобы отобразить его правильно, вам просто нужно выводить с правильным форматированием (т.е. интерпретироваться как символ Unicode, а не int).
Изменить:
fmt.Println(i, str[i], elem)
в
fmt.Printf("%d %c %c\n", i, str[i], elem)
%c
- это символ, представленный соответствующей кодовой точкой Юникода на документ Printf: http://golang.org/pkg/fmt/