Bagaimana cara mengindeks karakter dalam string Golang?


103

Bagaimana cara mendapatkan output "E" daripada 69?

package main

import "fmt"

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

Apakah Golang memiliki fungsi untuk mengubah karakter menjadi byte dan sebaliknya?

Jawaban:


157

Literal string yang ditafsirkan adalah urutan karakter antara "" tanda kutip ganda menggunakan pengkodean UTF-8 (mungkin multi-byte) dari karakter individual. Dalam UTF-8, karakter ASCII adalah byte tunggal yang sesuai dengan 128 karakter Unicode pertama. String berperilaku seperti potongan byte. Rune adalah nilai integer yang mengidentifikasi titik kode Unicode. Karena itu,

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
}

Keluaran:

e
e
界

Baca:

Buka bagian Spesifikasi Bahasa Pemrograman di Konversi .

Blog Go: String, byte, rune, dan karakter di Go


19

Bagaimana kalau begini ?

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

Seperti yang ditunjukkan Peter, untuk memungkinkan lebih dari sekadar ASCII:

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

10

Bisa dilakukan dengan mengiris juga

package main

import "fmt"

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

CATATAN: Solusi ini hanya berfungsi untuk karakter ASCII.


ini hanya berfungsi dengan pengkodean satu byte, coba "हैलो"[:1]ini memberi Anda
vladkras

@vladkras Anda benar. Ini hanya bekerja dengan ASCII. Untuk UTF-8, lihat jawaban yang disetujui. Saya juga akan mengedit solusi dengan informasi ini.
Samkit Jain

7

Go tidak memiliki tipe karakter seperti itu. byte sering digunakan untuk karakter ASCII, dan rune digunakan untuk karakter Unicode, tetapi keduanya hanyalah alias untuk tipe integer (uint8 dan int32). Jadi jika Anda ingin memaksanya untuk dicetak sebagai karakter, bukan angka, Anda perlu menggunakan Printf("%c", x). The %cspesifikasi format bekerja untuk setiap tipe integer.


5

Anda juga dapat mencoba mengetik dengan string.

package main

import "fmt"

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

4

Solusi umum untuk menafsirkan karakter sebagai string adalah string("HELLO"[1]).

Solusi kaya juga berhasil, tentu saja.


1

Karakter string adalah rune, jadi untuk mencetaknya, Anda harus mengubahnya kembali menjadi String.

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


0

Cobalah ini untuk mendapatkan karakter berdasarkan indeks mereka

package main

import (
      "fmt"
      "strings"
)

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

-3

Solusi lain untuk mengisolasi karakter dalam sebuah string

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
       }

}

untuk array string juga:

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

// = baris yang diberi komentar


11
Sungguh, kode yang sangat buruk yang akan membuat panik dengan masukan Unicode ( len("cafés")> len([]rune("cafés"))dan dapat mengubah string pada setiap iterasi untuk, O (n²). Lakukan saja for _, r := range word { fmt.Printf("%c", r) }. Jika Anda benar-benar ingin mengulang dengan indeks for x := 0; x < limit; x++. Harap pelajari dasar-dasar bahasa sebelum menjawab pertanyaan.
Dave C
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.