В вики Python есть хорошая статья по этой теме: Почему списки не могут быть ключами для слова . Как объяснялось там:
Что пойдет не так, если вы попытаетесь использовать списки в качестве ключей, с хешем, как, скажем, с их ячейкой памяти?
It может быть сделано без действительно нарушения каких-либо требований, но это приводит к неожиданному поведению. Списки обычно обрабатываются так, как если бы их значение было получено из значений их содержимого, например, при проверке (in) равенства. Многие из них, по понятным причинам, ожидают, что вы можете использовать любой список
[1, 2]
, чтобы получить тот же ключ, где вам нужно будет поддерживать точно такой же объект списка. Но поиск по значениям разрывается, как только список, используемый как ключ, изменяется, а для поиска по идентификатору требуется, чтобы вы придерживались точно такого же списка, что не требуется для какой-либо другой операции общего списка (по крайней мере, я не могу думать о ).Другие объекты, такие как модули и
object
, в любом случае делают гораздо большую сделку из их идентичности объектов (когда в последний раз у вас были два отдельных объекта модуля, называемыхsys
?), и они по сравнению с этим в любом случае. Поэтому менее удивительно или даже ожидать, что они, когда они используются в качестве ключей ключей, сравниваются по идентичности в этом случае.
Интерпретированные строковые литералы представляют собой последовательности символов между двойными кавычками "", используя (возможно многобайтовое) кодирование UTF-8 отдельных символов. В UTF-8 символы ASCII имеют один байт, соответствующий первым 128 символам Юникода. Строки ведут себя как кусочки байтов. Руна представляет собой целочисленное значение, определяющее кодовую точку Юникода. Поэтому
package main
import "fmt"
func main() {
fmt.Println(string("Hello"[1])) // ASCII only
fmt.Println(string([]rune("Hello, 世界")[1])) // UTF-8
fmt.Println(string([]rune("Hello, 世界")[8])) // UTF-8
}
Выход:
e
e
界
Чтение:
Перейти к разделу Спецификация языка программирования в Конверсии .
Go действительно не имеет типа символа как такового. байт часто используется для символов ASCII, а руна используется для символов Unicode, но они оба являются просто псевдонимами для целых типов (uint8 и int32). Поэтому, если вы хотите заставить их печатать как символы вместо цифр, вам нужно использовать Printf("%c", x)
. Спецификация формата %c
работает для любого целочисленного типа.
Другое решение изолировать символ в строке
package main
import "fmt"
func main() {
var word string = "ZbjTS"
// P R I N T
fmt.Println(word)
yo := string([]rune(word)[0])
fmt.Println(yo)
//I N D E X
x :=0
for x < len(word){
yo := string([]rune(word)[x])
fmt.Println(yo)
x+=1
}
}
для строковых массивов также:
fmt.Println(string([]rune(sArray[0])[0]))
// = commented line
len("cafés")
& gt; len([]rune("cafés"))
и может переконвертировать строку на каждой итерации для O (n²). Просто выполните for _, r := range word { fmt.Printf("%c", r) }
. действительно хотел, чтобы цикл с индексом for x := 0; x < limit; x++
. Пожалуйста, i> изучите основы языка перед ответом на вопросы.
– Dave C
2 April 2015 в 20:15
Как насчет этого ?
fmt.Printf("%c","HELLO"[1])
Как указывает Питер, чтобы разрешить больше, чем просто ASCII:
fmt.Printf("%c", []rune("HELLO")[1])
Можно выполнить также с помощью нарезки
package main
import "fmt"
func main() {
fmt.Print("HELLO"[1:2])
}
Общее решение для интерпретации char как строки - string("HELLO"[1])
.
Решение Rich также работает, конечно.