Wie indiziere ich Zeichen in einer Golang-Zeichenfolge?

96

Wie bekomme ich eine "E" -Ausgabe anstatt 69?

package main

import "fmt"

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

Hat Golang die Funktion, ein Zeichen in Byte umzuwandeln und umgekehrt?

user977828
quelle

Antworten:

144

Interpretierte String-Literale sind Zeichenfolgen zwischen doppelten Anführungszeichen unter Verwendung der (möglicherweise mehrbyteigen) UTF-8-Codierung einzelner Zeichen. In UTF-8 sind ASCII-Zeichen Einzelbyte, die den ersten 128 Unicode-Zeichen entsprechen. Strings verhalten sich wie Byte-Slices. Eine Rune ist ein ganzzahliger Wert, der einen Unicode-Codepunkt identifiziert. Deshalb,

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
}

Ausgabe:

e
e

Lesen:

Gehen Sie zum Abschnitt Programmiersprachenspezifikation unter Konvertierungen .

The Go Blog: Zeichenfolgen, Bytes, Runen und Zeichen in Go

peterSO
quelle
19

Wie wäre es damit ?

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

Wie Peter betont, um mehr als nur ASCII zuzulassen:

fmt.Printf("%c", []rune("HELLO")[1])
Reicher Kirchenmann
quelle
9

Kann auch durch Schneiden erfolgen

package main

import "fmt"

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

Go hat eigentlich keinen Charaktertyp als solchen. Byte wird häufig für ASCII-Zeichen verwendet, und Rune wird für Unicode-Zeichen verwendet, aber beide sind nur Aliase für Ganzzahltypen (uint8 und int32). Wenn Sie also erzwingen möchten, dass sie als Zeichen anstelle von Zahlen gedruckt werden, müssen Sie sie verwenden Printf("%c", x). Die %cFormatspezifikation funktioniert für jeden Ganzzahltyp.

andybalholm
quelle
4

Die allgemeine Lösung für die Interpretation eines Zeichens als Zeichenfolge lautet string("HELLO"[1]).

Natürlich funktioniert auch Richs Lösung.

Thomas Kappler
quelle
4

Sie können auch versuchen, es mit einer Zeichenfolge zu typisieren.

package main

import "fmt"

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

Versuchen Sie dies, um die Zeichen anhand ihres Index zu ermitteln

package main

import (
      "fmt"
      "strings"
)

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

Eine andere Lösung, um ein Zeichen in einer Zeichenfolge zu isolieren

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
       }

}

für String-Arrays auch:

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

// = kommentierte Zeile

HMC
quelle
11
Wirklich, wirklich schlechter Code, der bei Unicode-Eingaben in Panik gerät ( len("cafés")> len([]rune("cafés"))und möglicherweise die Zeichenfolge bei jeder Iteration für O (n²) neu konvertiert for _, r := range word { fmt.Printf("%c", r) }. Tun Sie dies einfach . Wenn Sie wirklich eine Schleife mit einem Index durchführen möchtenfor x := 0; x < limit; x++ . Bitte lernen Sie die Grundlagen einer Sprache, bevor Sie antworten Fragen.
Dave C