Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengekalkan Alamat Memori Asal Apabila Menukar Sekeping Rentetan kepada Sekeping Penunjuk Rentetan?

Bagaimana untuk Mengekalkan Alamat Memori Asal Apabila Menukar Sekeping Rentetan kepada Sekeping Penunjuk Rentetan?

Patricia Arquette
Lepaskan: 2024-12-26 11:09:14
asal
499 orang telah melayarinya

How to Preserve Original Memory Addresses When Converting a Go Slice of Strings to a Slice of String Pointers?

Memelihara Alamat Pengecam dalam Penukaran Slice

Dalam Go, menukarkan sekeping rentetan (nilai1) kepada sekeping penunjuk kepada rentetan (nilai2 ) memberikan cabaran yang unik. Kod yang disediakan di bawah menggambarkan isu:

values1 := []string{"a", "b", "c"}
var values2 []*string
for _, v := range values1 {
    fmt.Printf("%p | %T\n", v, v)
    values2 = append(values2, &v)
}
Salin selepas log masuk

Dijangka, output mendedahkan bahawa setiap elemen dalam nilai2 menghala ke alamat memori yang sama, walaupun mempunyai nilai yang berbeza. Ini berlaku kerana pembolehubah gelung julat v ialah salinan nilai rentetan asal, bukan penunjuk kepadanya. Akibatnya, v kekal sebagai nilai rentetan, walaupun apabila diberikan nilai baharu dalam gelung.

Pelaksanaan Penyelesaian

Untuk menyelesaikan isu ini, kita mesti menambahkan alamat daripada unsur hirisan asal kepada nilai2. Berikut ialah dua penyelesaian yang mungkin:

1. Mengindeks Slice Asal

for i, _ := range values1 {
    values2 = append(values2, &values1[i])
}
Salin selepas log masuk

Dengan mengakses elemen hirisan melalui pengindeksan, kami memperoleh alamat penuding yang diingini dan mengekalkan nilainya yang berbeza.

2. Menggunakan Pembolehubah Sementara

for _, v := range values1 {
    v2 := v
    values2 = append(values2, &v2)
}
Salin selepas log masuk

Dalam pendekatan ini, kami mengisytiharkan pembolehubah sementara (v2) untuk memegang setiap nilai rentetan. Dengan memberikan v2 kepada &v2, kami mencipta nilai penunjuk bebas yang memastikan nilai2 mengandungi penunjuk unik.

Implikasi Memelihara Alamat Pengecam

Adalah penting untuk ambil perhatian bahawa mengekalkan pengecam alamat mempunyai implikasi tertentu:

  • Susunan sandaran nilai1 dikekalkan dalam ingatan selagi nilai1 dan nilai2 boleh dicapai.
  • Pengubahsuaian elemen nilai1 akan ditunjukkan dalam nilai2.
  • Untuk mengelakkan nilai1 daripada menjadi sampah dikumpul, sama ada gunakan pengindeksan atau sementara pembolehubah, seperti yang diterangkan dalam penyelesaian di atas.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Alamat Memori Asal Apabila Menukar Sekeping Rentetan kepada Sekeping Penunjuk Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan