(Mendapat perasaan bahwa jawaban di atas masih tidak menyatakan perbedaan & hubungan antara string
dan []rune
sangat jelas, jadi saya akan mencoba menambahkan jawaban lain dengan contoh.)
Seperti @Strangework
jawaban yang dikatakan, string
dan []rune
diam berbeda.
Perbedaan - string
& []rune
:
string value
adalah slice byte read-only. Dan, string literal dikodekan dalam utf-8. Setiap karakter string
sebenarnya membutuhkan 1 ~ 3 byte, sementara masing rune
- masing karakter 4 byte
- Untuk
string
, keduanya len()
dan indeks didasarkan pada byte.
- Untuk
[]rune
, keduanya len()
dan indeks didasarkan pada rune (atau int32).
Hubungan - string
& []rune
:
- Ketika Anda mengkonversi dari
string
menjadi []rune
, setiap karakter utf-8 dalam string itu menjadi arune
.
- Demikian pula dalam konversi terbalik, saat mengkonversi dari
[]rune
ke string
, masing-masing rune
menjadi karakter utf-8 di string
.
Kiat:
- Anda dapat mengkonversi antara
string
dan []rune
, tetapi masih berbeda, dalam kedua jenis & ukuran keseluruhan.
(Saya akan menambahkan contoh untuk menunjukkannya dengan lebih jelas.)
Kode
string_rune_compare.go:
// string & rune compare,
package main
import "fmt"
// string & rune compare,
func stringAndRuneCompare() {
// string,
s := "hello你好"
fmt.Printf("%s, type: %T, len: %d\n", s, s, len(s))
fmt.Printf("s[%d]: %v, type: %T\n", 0, s[0], s[0])
li := len(s) - 1 // last index,
fmt.Printf("s[%d]: %v, type: %T\n\n", li, s[li], s[li])
// []rune
rs := []rune(s)
fmt.Printf("%v, type: %T, len: %d\n", rs, rs, len(rs))
}
func main() {
stringAndRuneCompare()
}
Menjalankan:
jalankan string_rune_compare.go
Keluaran:
hello你好, type: string, len: 11
s[0]: 104, type: uint8
s[10]: 189, type: uint8
[104 101 108 108 111 20320 22909], type: []int32, len: 7
Penjelasan:
String hello你好
memiliki panjang 11, karena 5 karakter pertama masing-masing mengambil 1 byte saja, sedangkan 2 karakter Cina terakhir masing-masing membutuhkan 3 byte.
- Jadi,
total bytes = 5 * 1 + 2 * 3 = 11
- Sejak
len()
pada string didasarkan pada byte, maka baris pertama dicetaklen: 11
- Karena indeks pada string juga didasarkan pada byte, maka 2 baris berikut ini mencetak nilai tipe
uint8
(karena byte
ini adalah tipe alias uint8
, dalam perjalanan).
Ketika mengkonversi string
ke []rune
, ia menemukan 7 utf8 karakter, sehingga 7 rune.
- Karena
len()
on []rune
didasarkan pada rune, maka baris terakhir dicetaklen: 7
.
- Jika Anda beroperasi
[]rune
melalui indeks, itu akan mengakses berdasarkan rune.
Karena setiap rune berasal dari karakter utf8 di string asli, maka Anda juga bisa mengatakan keduanya len()
dan operasi indeks []rune
didasarkan pada karakter utf8.