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

Bagaimana untuk mendedahkan anggota hirisan dengan kebolehubahan?

PHPz
PHPzke hadapan
2024-02-09 09:20:11599semak imbas

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
}

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]

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

func (a *A) list() []int {
    return append([]int{}, a.slice...)
}
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)
    }
}

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
        }
    }
}

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

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam