Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Saya Boleh Mengakses Larian Rawak dengan Cekap dalam Go Strings Tanpa Menggunakan For Loops?

Bagaimanakah Saya Boleh Mengakses Larian Rawak dengan Cekap dalam Go Strings Tanpa Menggunakan For Loops?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-24 07:01:10371semak imbas

How Can I Efficiently Access Random Runes in Go Strings Without Using For Loops?

Mengakses Elemen Rune Rawak dalam Rentetan

Masalah

Bagaimana elemen rune rawak dalam rentetan boleh diakses dengan cekap tanpa bergantung pada "untuk ... julat" gelung?

Latar Belakang

Go strings menyimpan jujukan bait berkod UTF-8. Walaupun gelung "untuk ... julat" membenarkan penyahkodan dan mendapatkan semula rune yang cekap, mengakses rune melalui fungsi langsung seperti "str.At(i)" tidak tersedia. Ini menyebabkan pembangun mencari kaedah alternatif untuk akses rune yang kerap.

Penyelesaian

Seperti yang dinyatakan dalam respons yang disediakan, had berikut dikenakan:

  • Nilai rentetan dalam Go mengandungi urutan UTF-8 bait, memerlukan penyahkodan untuk rune pengambilan semula.
  • Perwakilan rentetan tidak menyediakan akses rune langsung pada indeks sewenang-wenangnya.

Pengesyoran

Untuk pengoptimuman prestasi, pertimbangkan untuk menukar input rentetan kepada sekeping rune ([]rune) jika akses rune diperlukan dengan kerap. Tidak seperti rentetan, yang merupakan kepingan bait baca sahaja dengan berkesan, kepingan rune membenarkan pengindeksan yang cekap.

Alternatif

Jika penukaran input tidak dapat dilaksanakan, cache boleh dilaksanakan untuk memetakan rentetan kepada kepingan rune yang sepadan. Ini meningkatkan prestasi untuk kes yang melibatkan set kecil rentetan berulang. Walau bagaimanapun, untuk rentetan yang unik atau jarang, caching boleh menjadi tidak cekap dan menggunakan memori yang berlebihan.

Contoh

Coretan kod berikut menunjukkan pelaksanaan cache mudah untuk pengambilan rune:

import (
    "fmt"
    "sync"
)

var cache = sync.Map{}

func RuneAt(s string, idx int) rune {
    rs, ok := cache.Load(s)
    if !ok {
        rs = []rune(s)
        cache.Store(s, rs)
    }
    if idx >= len(rs) {
        return 0
    }
    return rs[idx]
}

func main() {
    str := "你好,世界!"
    for i := 0; i < len(str); i++ {
        fmt.Printf("%c ", RuneAt(str, i))
    }
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Larian Rawak dengan Cekap dalam Go Strings Tanpa Menggunakan For Loops?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn