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!