Проблема Charset при итерации по строке в Go [duplicate]

В вики Python есть хорошая статья по этой теме: Почему списки не могут быть ключами для слова . Как объяснялось там:

Что пойдет не так, если вы попытаетесь использовать списки в качестве ключей, с хешем, как, скажем, с их ячейкой памяти?

It может быть сделано без действительно нарушения каких-либо требований, но это приводит к неожиданному поведению. Списки обычно обрабатываются так, как если бы их значение было получено из значений их содержимого, например, при проверке (in) равенства. Многие из них, по понятным причинам, ожидают, что вы можете использовать любой список [1, 2], чтобы получить тот же ключ, где вам нужно будет поддерживать точно такой же объект списка. Но поиск по значениям разрывается, как только список, используемый как ключ, изменяется, а для поиска по идентификатору требуется, чтобы вы придерживались точно такого же списка, что не требуется для какой-либо другой операции общего списка (по крайней мере, я не могу думать о ).

Другие объекты, такие как модули и object, в любом случае делают гораздо большую сделку из их идентичности объектов (когда в последний раз у вас были два отдельных объекта модуля, называемых sys?), и они по сравнению с этим в любом случае. Поэтому менее удивительно или даже ожидать, что они, когда они используются в качестве ключей ключей, сравниваются по идентичности в этом случае.

47
задан 030 10 November 2015 в 15:55
поделиться

6 ответов

Интерпретированные строковые литералы представляют собой последовательности символов между двойными кавычками "", используя (возможно многобайтовое) кодирование 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: строки, байты, руны и символы в Go

79
ответ дан peterSO 16 August 2018 в 05:33
поделиться

Go действительно не имеет типа символа как такового. байт часто используется для символов ASCII, а руна используется для символов Unicode, но они оба являются просто псевдонимами для целых типов (uint8 и int32). Поэтому, если вы хотите заставить их печатать как символы вместо цифр, вам нужно использовать Printf("%c", x). Спецификация формата %c работает для любого целочисленного типа.

6
ответ дан andybalholm 16 August 2018 в 05:33
поделиться

Другое решение изолировать символ в строке

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

-2
ответ дан H M C 16 August 2018 в 05:33
поделиться
  • 1
    Действительно, действительно плохой код, который будет паниковать с вводом Unicode (len("cafés") & gt; len([]rune("cafés")) и может переконвертировать строку на каждой итерации для O (n²). Просто выполните for _, r := range word { fmt.Printf("%c", r) }. действительно хотел, чтобы цикл с индексом for x := 0; x < limit; x++. Пожалуйста, изучите основы языка перед ответом на вопросы. – Dave C 2 April 2015 в 20:15

Как насчет этого ?

fmt.Printf("%c","HELLO"[1])

Как указывает Питер, чтобы разрешить больше, чем просто ASCII:

fmt.Printf("%c", []rune("HELLO")[1])
7
ответ дан Rich Churcher 16 August 2018 в 05:33
поделиться

Можно выполнить также с помощью нарезки

package main

import "fmt"

func main() {
    fmt.Print("HELLO"[1:2])
}
1
ответ дан Samkit Jain 16 August 2018 в 05:33
поделиться

Общее решение для интерпретации char как строки - string("HELLO"[1]).

Решение Rich также работает, конечно.

4
ответ дан Thomas Kappler 16 August 2018 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: