Dalam Go, rentetan dianggap sebagai kepingan bait dan bukannya urutan aksara. Ini boleh menyukarkan untuk melaksanakan operasi peringkat aksara seperti menterbalikkan rentetan.
Mari kita pertimbangkan senario berikut: kita mempunyai beberapa rentetan aksara rawak dengan panjang yang berbeza-beza (100, 200, 300, 400, dan 500). Kami mahu menyongsangkan aksara setiap rentetan.
Percubaan untuk menetapkan aksara terus kepada indeks berbeza dalam rentetan mengakibatkan ralat, kerana Go tidak membenarkan peringkat aksara langsung tugasan kepada rentetan.
Andrew Sellers menyediakan pendekatan inovatif dalam intipatinya yang mengendalikan Unicode menggabungkan tanda diakritik (CDM) dan aksara Unikod kompleks lain.
Dia memperkenalkan teknik untuk mengesan dan mengekalkan susunan CDM, yang merupakan sebahagian daripada blok Unicode kompleks yang mempengaruhi gabungan aksara dalam rentetan.
Penyelesaian melibatkan lelaran melalui rentetan dalam susunan terbalik dan mengenal pasti CDM menggunakan jadual julat. CDM disimpan, dan kemudian digabungkan dengan aksara biasa sebelum menambahkannya pada tatasusunan terbalik.
Untuk aksara seperti emoji dan pengubah suai, pendekatan memerlukan pertimbangan khusus untuk mengekalkan susunan elemen dan perwakilan yang betul bagi glif yang digubah.
Berikut ialah coretan kod berdasarkan pendekatan Andrew Sellers:
<code class="go">package main import ( "fmt" "os" "runtime" "unicode" ) func main() { var stringsToReverse = []string{"Hello, World", "??⃠?", "???????⚖️", "aͤoͧiͤ š́ž́ʟ́", "H̙̖ell͔o̙̟͚͎̗̹̬ ̯W̖͝ǫ̬̞̜rḷ̦̣̪d̰̲̗͈"} for _, s := range stringsToReverse { fmt.Printf("Reverse '%s' => '%s'\n", s, ReverseString(s)) } fmt.Printf("Memory usage: %d bytes\n", runtime.MemStats.Alloc) os.Exit(0) } // ReverseString reverses the characters in a string, handling Unicode combining diacritical marks func ReverseString(s string) string { sv := []rune(s) cv := make([]rune, 0) rv := make([]rune, 0) for ix := len(sv) - 1; ix >= 0; ix-- { r := sv[ix] if unicode.In(r, combining) { cv = append(cv, r) fmt.Printf("Detect combining diacritical mark ' %c'\n", r) } else { rrv := make([]rune, 0, len(cv)+1) rrv = append(rrv, r) rrv = append(rrv, cv...) fmt.Printf("regular mark '%c' (with '%d' combining diacritical marks '%s') => '%s'\n", r, len(cv), string(cv), string(rrv)) rv = append(rv, rrv...) cv = make([]rune, 0) } } return string(rv) }</code>
Atas ialah kandungan terperinci Bagaimana untuk Membalikkan Rentetan dalam Go, Mengendalikan Unikod Menggabungkan Tanda Diakritik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!