Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menukar Sekeping Rentetan kepada Sekeping Petunjuk Rentetan dalam Go?

Bagaimana untuk Menukar Sekeping Rentetan kepada Sekeping Petunjuk Rentetan dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-14 20:38:19567semak imbas

How to Convert a Slice of Strings to a Slice of String Pointers in Go?

Menukar Slice of Strings to Slice of Pointers to Strings

Matlamat tugasan ini adalah untuk mengubah hirisan rentetan menjadi kepingan yang mengandungi penunjuk kepada setiap rentetan tersebut. Mari kita periksa contoh khusus:

values1 := []string{"a", "b", "c"}
var values2 []*string

for _, v := range values1 {
    fmt.Printf("%p | %T\n", v, v)
    values2 = append(values2, &v)
}
fmt.Println(values2)

Kekeliruan Awal

Ia mungkin kelihatan berlawanan dengan intuisi bahawa v, walaupun merupakan rentetan, kekal pada alamat memori yang sama sepanjang gelung . Ini kerana dalam kes ini, v bukan penunjuk kepada rentetan, sebaliknya salinan setiap rentetan dalam nilai1.

Dua Kemungkinan Penyelesaian

Penyelesaian 1:

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

Kaedah ini menambah penunjuk dengan betul kepada elemen dalam asal nilai1 potong kepada nilai2. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa nilai2 kini mengandungi alamat yang menunjuk terus ke nilai1, jadi nilai1 akan kekal dalam ingatan selagi nilai2 wujud.

Penyelesaian 2:

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

Penyelesaian alternatif ini mencipta pembolehubah tempatan sementara (v2) untuk setiap lelaran, memberikannya nilai v, dan kemudian menambahkan penunjuk kepada v2 kepada nilai2. Ini memastikan bahawa nilai1 adalah bebas daripada nilai2 dan sebarang pengubahsuaian kepada nilai1 tidak akan menjejaskan nilai2.

Atas ialah kandungan terperinci Bagaimana untuk Menukar Sekeping Rentetan kepada Sekeping Petunjuk Rentetan dalam Go?. 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