Apa itu rune
in Go?
Saya sudah googling tetapi Golang hanya mengatakan dalam satu baris: rune
adalah alias untukint32
.
Tapi kenapa bilangan bulat digunakan di sekitar seperti bertukar kasus?
Berikut ini adalah swapcase fungsi. Apa itu semua <=
dan -
?
Dan mengapa tidak switch
punya argumen?
&&
harus berarti dan tetapi apa itu r <= 'z'
?
func SwapRune(r rune) rune {
switch {
case 'a' <= r && r <= 'z':
return r - 'a' + 'A'
case 'A' <= r && r <= 'Z':
return r - 'A' + 'a'
default:
return r
}
}
Sebagian besar dari mereka berasal dari http://play.golang.org/p/H6wjLZj6lW
func SwapCase(str string) string {
return strings.Map(SwapRune, str)
}
Saya mengerti ini adalah pemetaan rune
untuk string
sehingga dapat mengembalikan string bertukar. Tetapi saya tidak mengerti bagaimana tepatnya rune
atau byte
bekerja di sini.
[]rune
dapat diatur ke tipe boolean, numerik, atau tipe string. Lihat stackoverflow.com/a/62739051/12817546 .Jawaban:
Rune literal hanyalah nilai integer 32-bit ( namun mereka adalah konstanta yang tidak diketik, sehingga tipenya dapat berubah ). Mereka mewakili codepoint unicode. Misalnya, Rune literal
'a'
sebenarnya adalah angka97
.Karenanya program Anda hampir sama dengan:
Seharusnya jelas, jika Anda melihat pemetaan Unicode, yang identik dengan ASCII dalam rentang itu. Lebih jauh, 32 sebenarnya adalah offset antara codepoint huruf besar dan huruf kecil dari karakter. Jadi dengan menambahkan
32
untuk'A'
, Anda mendapatkan'a'
dan sebaliknya.sumber
unicode.ToLower(r rune) rune
.func SwapRune(r rune) rune { if unicode.IsUpper(r) { r = unicode.ToLower(r) } else { r = unicode.ToUpper(r) }; return r }
Dari catatan rilis Go lang: http://golang.org/doc/go1#rune
Rune adalah Tipe. Ini menempati 32bit dan dimaksudkan untuk mewakili Unicode CodePoint . Sebagai analogi, karakter bahasa Inggris yang disandikan dalam 'ASCII' memiliki 128 poin kode. Dengan demikian dapat masuk ke dalam byte (8bit). Dari asumsi (keliru) ini, C memperlakukan karakter sebagai 'byte'
char
, dan 'string' sebagai 'urutan karakter'char*
.Tapi coba tebak. Ada banyak simbol lain yang diciptakan oleh manusia selain simbol 'abcde ..'. Dan ada begitu banyak yang kita butuhkan 32 bit untuk mengkodekannya.
Di golang maka a
string
adalah urutanbytes
. Namun, karena beberapa byte dapat mewakili titik kode rune, nilai string juga dapat berisi rune. Jadi, itu dapat dikonversi menjadi[]rune
, atau sebaliknya.Paket unicode http://golang.org/pkg/unicode/ dapat memberikan rasa kekayaan tantangan.
sumber
rune
sepertiint32
dan memiliki banyak bit.string
adalah urutanrune
s" - Saya tidak berpikir itu benar? Go blog : "string hanya setumpuk byte"; Go lang spec : "Nilai string adalah urutan byte (mungkin kosong)"not bytes
. Kemudian, Anda mungkin berkata: "String terdiri dari rune dan rune terdiri dari byte" Sesuatu seperti itu. Kemudian lagi. itu tidak sepenuhnya benar.Saya telah mencoba untuk menjaga bahasa saya tetap sederhana sehingga orang awam mengerti
rune
.Rune adalah karakter. Itu dia.
Ini adalah karakter tunggal. Ini adalah karakter dari alfabet apa pun dari bahasa apa pun dari mana saja di dunia.
Untuk mendapatkan string yang kita gunakan
ATAU
String berbeda dari rune. Dalam rune kita gunakan
Sekarang rune juga merupakan alias untuk
int32
... Eh Apa?Alasan Rune adalah alias untuk
int32
karena kita melihat bahwa dengan skema pengkodean seperti di bawah inisetiap karakter memetakan ke beberapa nomor dan itu nomor yang kita simpan. Sebagai contoh, a peta ke 97 dan ketika kita menyimpan nomor bahwa itu hanya jumlah dan sehingga ini cara Rune adalah alias untuk int32. Tapi bukan sembarang nomor. Ini adalah angka dengan 32 'nol dan satu' atau '4' byte. (Catatan: UTF-8 adalah skema penyandian 4 byte)
Bagaimana rune berhubungan dengan string?
String adalah kumpulan rune. Dalam kode berikut:
Kami mencoba mengonversi string ke aliran byte. Outputnya adalah:
Kita dapat melihat bahwa masing-masing byte yang membentuk string itu adalah sebuah rune.
sumber
A string is not a collection of runes
ini tidak sepenuhnya benar. Sebaliknya, string adalah irisan byte, yang dikodekan dengan utf8. Setiap karakter dalam string sebenarnya membutuhkan 1 ~ 3 byte, sedangkan setiap rune membutuhkan 4 byte. Anda dapat mengonversi antara string dan [] rune, tetapi keduanya berbeda.Saya tidak memiliki reputasi yang cukup untuk mengirim komentar ke jawaban fabrizioM , jadi saya harus mempostingnya di sini.
Jawaban Fabrizio sebagian besar benar, dan dia tentu saja menangkap esensi masalah - meskipun ada perbedaan yang harus dibuat.
Sebuah string TIDAK harus berupa urutan rune. Ini adalah pembungkus lebih dari 'sepotong byte', sepotong menjadi pembungkus atas array Go. Apa bedanya ini?
Sebuah Rune jenis adalah tentu nilai 32-bit, yang berarti urutan nilai dari jenis Rune akan selalu memiliki beberapa jumlah bit x * 32. String, menjadi urutan byte, sebaliknya memiliki panjang x * 8 bit. Jika semua string sebenarnya dalam Unicode, perbedaan ini tidak akan berdampak. Karena string adalah irisan byte , Go dapat menggunakan ASCII atau pengkodean byte sewenang-wenang lainnya.
Namun demikian, string literal harus ditulis ke dalam sumber yang disandikan dalam UTF-8.
Sumber informasi: http://blog.golang.org/strings
sumber
(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 karakterstring
sebenarnya membutuhkan 1 ~ 3 byte, sementara masingrune
- masing karakter 4 bytestring
, keduanyalen()
dan indeks didasarkan pada byte.[]rune
, keduanyalen()
dan indeks didasarkan pada rune (atau int32).Hubungan -
string
&[]rune
:string
menjadi[]rune
, setiap karakter utf-8 dalam string itu menjadi arune
.[]rune
kestring
, masing-masingrune
menjadi karakter utf-8 distring
.Kiat:
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:
Menjalankan:
Keluaran:
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.total bytes = 5 * 1 + 2 * 3 = 11
len()
pada string didasarkan pada byte, maka baris pertama dicetaklen: 11
uint8
(karenabyte
ini adalah tipe aliasuint8
, dalam perjalanan).Ketika mengkonversi
string
ke[]rune
, ia menemukan 7 utf8 karakter, sehingga 7 rune.len()
on[]rune
didasarkan pada rune, maka baris terakhir dicetaklen: 7
.[]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.sumber
fmt.Println("hello你好"[0])
mengembalikan titik kode UTF-8 yang sebenarnya, bukan byte.s[0]
, ia mencetaks[0]: 104, type: uint8
, tipenyauint8
, berarti byte. Untuk karakter ASCII sepertih
utf-8 juga menggunakan byte tunggal untuk mewakilinya, sehingga titik kode sama dengan byte tunggal; tetapi untuk karakter Cina suka你
, itu menggunakan 3 byte.Semua orang telah membahas bagian yang berhubungan dengan rune, jadi saya tidak akan membicarakan hal itu.
Namun, ada juga pertanyaan terkait
switch
tidak memiliki argumen. Ini hanya karena di Golang,switch
tanpa ekspresi adalah cara alternatif untuk mengekspresikan logika if / else. Misalnya, menulis ini:sama dengan menulis ini:
Anda dapat membaca lebih lanjut di sini .
sumber
Rune adalah nilai int32, dan karenanya merupakan tipe Go yang digunakan untuk mewakili titik kode Unicode. Titik kode Unicode atau posisi kode adalah nilai numerik yang biasanya digunakan untuk mewakili karakter Unicode tunggal;
sumber