Bir Golang dizesindeki karakterler nasıl indekslenir?


101

69 yerine "E" çıkışı nasıl alınır?

package main

import "fmt"

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

Golang'ın bir karakteri bayta dönüştürme işlevi var mı ve bunun tersi de geçerli mi?

Yanıtlar:


150

Yorumlanan dize değişmezleri, tek tek karakterlerin (muhtemelen çok baytlı) UTF-8 kodlamasını kullanan çift tırnak "" arasındaki karakter dizileridir. UTF-8'de ASCII karakterleri, ilk 128 Unicode karakterine karşılık gelen tek bayttır. Dizeler bayt dilimleri gibi davranır. Bir rune, bir Unicode kod noktasını tanımlayan bir tamsayı değeridir. Bu nedenle,

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
}

Çıktı:

e
e
界

Oku:

Dönüşümler ile ilgili Programlama Dili Spesifikasyonu bölümüne gidin .

The Go Blog: Go'daki dizeler, baytlar, sayılar ve karakterler


19

Nasıl hakkında bu ?

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

Peter'ın işaret ettiği gibi, ASCII'den daha fazlasına izin vermek için:

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

10

Dilimleme yoluyla da yapılabilir

package main

import "fmt"

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

NOT: Bu çözüm yalnızca ASCII karakterleri için çalışır.


bu yalnızca tek baytlık kodlamalarla çalışır, deneyin "हैलो"[:1]size verir
vladkras

@vladkras Doğru söylüyorsunuz. Yalnızca ASCII ile çalışır. UTF-8 için onaylanmış cevaba bir göz atın. Çözümü bu bilgilerle de düzenleyeceğim.
Samkit Jain

7

Go'nun gerçekten böyle bir karakter türü yoktur. bayt genellikle ASCII karakterleri için kullanılır ve rune, Unicode karakterleri için kullanılır, ancak her ikisi de tam sayı türleri için takma adlardır (uint8 ve int32). Dolayısıyla, onları sayılar yerine karakter olarak yazdırılmaya zorlamak istiyorsanız, kullanmanız gerekir Printf("%c", x). %cBiçim şartname herhangi bir tamsayı türü için çalışır.


5

Ayrıca string ile yazmayı da deneyebilirsiniz.

package main

import "fmt"

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

4

Bir karakter dizisini yorumlamanın genel çözümü şudur string("HELLO"[1]).

Rich'in çözümü de tabii ki işe yarıyor.


0

Karakterleri indekslerine göre almak için bunu deneyin

package main

import (
      "fmt"
      "strings"
)

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

0

Dize karakterleri runelerdir, bu yüzden onları yazdırmak için onları String'e geri döndürmeniz gerekir.

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


-3

Bir dizedeki bir karakteri izole etmek için başka bir çözüm

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
       }

}

dizi dizileri için ayrıca:

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

// = yorumlanmış satır


11
Gerçekten, Unicode girişi ile paniğe kapılacak ( len("cafés")> len([]rune("cafés"))ve her yinelemede dizeyi O (n²) için yeniden dönüştürecek gerçekten kötü bir kod . Yapmanız yeterli for _, r := range word { fmt.Printf("%c", r) }. Gerçekten bir dizinle döngü yapmak istiyorsanız for x := 0; x < limit; x++. Lütfen yanıtlamadan önce dilin temellerini öğrenin sorular.
Dave C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.