Come indicizzare i caratteri in una stringa Golang?


101

Come ottenere un'uscita "E" anziché 69?

package main

import "fmt"

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

Golang ha la funzione per convertire un carattere in byte e viceversa?

Risposte:


150

I valori letterali stringa interpretati sono sequenze di caratteri tra virgolette "" che utilizzano la codifica UTF-8 (possibilmente multibyte) dei singoli caratteri. In UTF-8, i caratteri ASCII sono a byte singolo corrispondenti ai primi 128 caratteri Unicode. Le stringhe si comportano come fette di byte. Una runa è un valore intero che identifica un punto di codice Unicode. Perciò,

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
}

Produzione:

e
e
界

Leggere:

Vai alla sezione Specifiche del linguaggio di programmazione sulle conversioni .

Il blog Go: stringhe, byte, rune e personaggi in Go


19

Che ne dici di questo ?

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

Come sottolinea Peter, per consentire più di un semplice ASCII:

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

10

Può essere fatto anche tramite affettatura

package main

import "fmt"

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

NOTA: questa soluzione funziona solo per i caratteri ASCII.


funziona solo con le codifiche a un byte, prova "हैलो"[:1]ti dà
vladkras

@vladkras Hai ragione. Funziona solo con ASCII. Per UTF-8, dai un'occhiata alla risposta approvata. Modificherò anche la soluzione con queste informazioni.
Samkit Jain

7

Go non ha davvero un tipo di carattere in quanto tale. byte viene spesso utilizzato per i caratteri ASCII e rune viene utilizzato per i caratteri Unicode, ma sono entrambi solo alias per i tipi interi (uint8 e int32). Quindi, se vuoi costringerli a essere stampati come caratteri invece che come numeri, devi usare Printf("%c", x). La %cspecifica del formato funziona per qualsiasi tipo di numero intero.


5

Puoi anche provare a digitarlo con string.

package main

import "fmt"

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

4

La soluzione generale per interpretare un carattere come una stringa è string("HELLO"[1]).

Naturalmente anche la soluzione di Rich funziona.


0

Prova questo per ottenere i caratteri dal loro indice

package main

import (
      "fmt"
      "strings"
)

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

0

I caratteri stringa sono rune, quindi per stamparli devi trasformarli di nuovo in stringa.

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


-3

Un'altra soluzione per isolare un carattere in una stringa

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
       }

}

anche per gli array di stringhe:

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

// = riga commentata


11
Davvero, codice davvero pessimo che andrà nel panico con l'input Unicode ( len("cafés")> len([]rune("cafés"))e potrebbe riconvertire la stringa a ogni iterazione per, O (n²). Fallo e basta for _, r := range word { fmt.Printf("%c", r) }. Se vuoi davvero eseguire il loop con un indice for x := 0; x < limit; x++. Per favore impara le basi di una lingua prima di rispondere domande
Dave C
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.