¿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?

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


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

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.


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.


5

También puedes intentar encasillarlo con una cuerda.

package main

import "fmt"

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

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.


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

0

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

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


-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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.