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
Patricia Arquetteasal
2024-12-26 11:09:14443semak imbas

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

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

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

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