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?

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


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

9

Kann auch durch Schneiden erfolgen

package main

import "fmt"

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

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.


4

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

Natürlich funktioniert auch Richs Lösung.


4

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

package main

import "fmt"

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

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

-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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.