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?

pengguna977828
sumber

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

peterSO
sumber
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])
Rich Churcher
sumber
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.

Samkit Jain
sumber
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.

andybalholm
sumber
5

Anda juga dapat mencoba mengetik dengan string.

package main

import "fmt"

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

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

Solusi kaya juga berhasil, tentu saja.

Thomas Kappler
sumber
1

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

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

lemmer
sumber
0

Cobalah ini untuk mendapatkan karakter berdasarkan indeks mereka

package main

import (
      "fmt"
      "strings"
)

func main() {
   str := strings.Split("HELLO","")
    fmt.Print(str[1])
}
Anshu
sumber
-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

HMC
sumber
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