Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengekalkan Alamat Memori Asal Apabila Menukar Sekeping Rentetan kepada Sekeping Penunjuk Rentetan?
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:
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!