¿Cómo indexar caracteres en una cadena Golang?

101

¿Cómo obtener una salida "E" en lugar de 69?

package main

import "fmt"

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

¿Golang tiene la función de convertir un carácter en un byte y viceversa?

user977828
fuente

Respuestas:

150

Los literales de cadena interpretados son secuencias de caracteres entre comillas dobles "" que utilizan la codificación UTF-8 (posiblemente de varios bytes) de caracteres individuales. En UTF-8, los caracteres ASCII son de un solo byte correspondientes a los primeros 128 caracteres Unicode. Las cadenas se comportan como porciones de bytes. Una runa es un valor entero que identifica un punto de código Unicode. Por lo tanto,

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
}

Salida:

e
e
界

Leer:

Vaya a la sección Especificación del lenguaje de programación sobre conversiones .

El blog de Go: cadenas, bytes, runas y personajes en Go

peterSO
fuente
19

¿Qué tal esto ?

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

Como señala Peter, para permitir algo más que ASCII:

fmt.Printf("%c", []rune("HELLO")[1])
Rich Churcher
fuente
10

También se puede hacer mediante rebanado

package main

import "fmt"

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

NOTA: Esta solución solo funciona para caracteres ASCII.

Samkit Jain
fuente
esto solo funciona con codificaciones de un byte, pruébalo "हैलो"[:1]te da
vladkras
@vladkras Tienes razón. Solo funciona con ASCII. Para UTF-8, eche un vistazo a la respuesta aprobada. También editaré la solución con esta información.
Samkit Jain
7

Go realmente no tiene un tipo de personaje como tal. byte se usa a menudo para caracteres ASCII y rune se usa para caracteres Unicode, pero ambos son solo alias para tipos enteros (uint8 e int32). Entonces, si desea forzar que se impriman como caracteres en lugar de números, debe usar Printf("%c", x). La %cespecificación de formato funciona para cualquier tipo de entero.

andybalholm
fuente
5

También puedes intentar encasillarlo con una cuerda.

package main

import "fmt"

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

La solución general para interpretar un carácter como una cadena es string("HELLO"[1]).

La solución de Rich también funciona, por supuesto.

Thomas Kappler
fuente
0

Intente esto para obtener los personajes por su índice

package main

import (
      "fmt"
      "strings"
)

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

Los caracteres de cadena son runas, por lo que para imprimirlos, debe convertirlos nuevamente en String.

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

lemmer
fuente
-3

Otra solución para aislar un carácter en una cadena

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
       }

}

para matrices de cadenas también:

fmt.Println(string([]rune(sArray[0])[0]))

// = línea comentada

HMC
fuente
11
Realmente, código realmente malo que entrará en pánico con la entrada Unicode ( len("cafés")> len([]rune("cafés"))y puede reconvertir la cadena en cada iteración para, O (n²). Solo hazlo for _, r := range word { fmt.Printf("%c", r) }. Si realmente quisieras hacer un bucle con un índice for x := 0; x < limit; x++. Por favor, aprende los conceptos básicos de un idioma antes de responder preguntas
Dave C