Як індексувати символи в рядку Голанга?


100

Як отримати вихід "Е", а не 69?

package main

import "fmt"

func main() {
    fmt.Print("HELLO"[1])
}

Чи є у Golang функція перетворення символу в байт і навпаки?

Відповіді:


149

Інтерпретовані рядкові літерали - це послідовності символів між подвійними лапками, "" використовуючи (можливо, багатобайтове) кодування UTF-8 окремих символів. У UTF-8 символи ASCII є однобайтовими, що відповідає першим 128 символам Unicode. Рядки поводяться як фрагменти байтів. Руна - це ціле значення, що ідентифікує кодову точку Юнікоду. Отже,

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



10

Це можна зробити за допомогою нарізки теж

package main

import "fmt"

func main() {
    fmt.Print("HELLO"[1:2])
}

ПРИМІТКА. Це рішення працює лише для символів ASCII.


це працює лише з однобайтовим кодуванням, спробуйте "हैलो"[:1]це дасть
vladkras

@vladkras Ви маєте рацію. Він працює лише з ASCII. Щодо UTF-8, подивіться на схвалену відповідь. Я також відредагую рішення з цією інформацією.
Самкіт Джейн

7

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


5

Ви також можете спробувати ввести його за допомогою рядка.

package main

import "fmt"

func main() {
    fmt.Println(string("Hello"[1]))
}

4

Загальним рішенням для інтерпретації символу char як рядка є string("HELLO"[1]).

Рішення Річа теж працює, звичайно.


0

Спробуйте це, щоб отримати символи за їх покажчиком

package main

import (
      "fmt"
      "strings"
)

func main() {
   str := strings.Split("HELLO","")
    fmt.Print(str[1])
}

0

Рядкові символи - це руни, тому, щоб їх надрукувати, вам доведеться перетворити їх назад на Рядок.

fmt.Print(string("HELLO"[1]))


-3

Ще одне рішення для виділення символу в рядок

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]))

// = коментований рядок


11
Дійсно, дуже поганий код, який викликає паніку з введенням Unicode ( len("cafés")> len([]rune("cafés"))і може перетворити рядок на кожній ітерації для, O (n²). Просто зробіть for _, r := range word { fmt.Printf("%c", r) }. Якщо ви дійсно хотіли цикл з індексом for x := 0; x < limit; x++. Будь ласка, вивчіть основи мови, перш ніж відповідати питання.
Dave C,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.