Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk mendedahkan anggota hirisan dengan kebolehubahan?

Bagaimana untuk mendedahkan anggota hirisan dengan kebolehubahan?

PHPz
Lepaskan: 2024-02-09 09:20:11
ke hadapan
662 orang telah melayarinya

Bagaimana untuk mendedahkan anggota hirisan dengan kebolehubahan?

PHP Editor Apple akan memperkenalkan kepada anda cara untuk mendedahkan ahli slice dengan ketidakbolehubah. Dalam pengaturcaraan, penghirisan merujuk kepada operasi memintas sebahagian daripada elemen atau aksara daripada tatasusunan atau rentetan. Biasanya, operasi penghirisan mengembalikan tatasusunan atau rentetan baharu, tetapi kadangkala kita mahu mengekalkan tatasusunan atau rentetan asal tidak berubah dan mendedahkan hanya beberapa ahli hirisan. Melakukannya boleh meningkatkan prestasi program anda dan penggunaan memori. Seterusnya, kami akan terperinci bagaimana untuk mencapai ini.

Kandungan soalan

Saya mempunyai struct dengan ahli hirisan, dan kaedah yang mendedahkan kepingan itu. Tetapi saya tidak mahu pemanggil boleh menukar kandungan kepingan itu. Jika saya lakukan:

type a struct {
    slice []int
}

func (a *a) list() []int {
    return a.slice
}
Salin selepas log masuk

Ia tidak selamat kerana kandungannya boleh diubah suai dengan mudah:

a := a{[]int{1, 2, 3}}
_ = append(a.list()[:2], 4)
fmt.println(a.list()) // [1 2 4]
Salin selepas log masuk

Jelas sekali saya boleh membuat list() kembalikan salinan kepingan untuk mengelakkan perkara ini:

func (a *A) list() []int {
    return append([]int{}, a.slice...)
}
Salin selepas log masuk
Tetapi ini bermakna saya mencipta salinan setiap kali saya hanya mahu mengulangi kepingan itu, yang nampaknya membazir. Adakah terdapat cara untuk melakukan ini tanpa menyalin yang tidak perlu?

Penyelesaian

Setelah anda memberikan kepingan kepada pemanggil luar dengan mengembalikannya, anda boleh mengubah suainya. Jika penyalinan tidak diterima atas sebab prestasi, anda boleh melaksanakan pelawat:

func (a *a) visit(f func(int)) {
    for _, v := range a.slice {
        f(v)
    }
}
Salin selepas log masuk

Ini tidak mendedahkan kepingan sama sekali dan membenarkan kod pelanggan melihat semua item dalam kepingan sekaligus. Jika item tersebut bukan penunjuk atau jenis boleh ubah lain, ini berkesan baca sahaja kerana panggilan balik pelawat akan menerima salinan nilai.

Jika anda ingin menghentikan lelaran lebih awal, pelawat boleh mengembalikan nilai boolean (pilihan).

func (a *A) Visit(f func(int) bool) {
    for _, v := range a.slice {
        if !f(v) {
            return
        }
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mendedahkan anggota hirisan dengan kebolehubahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan