Spesifikasi Go menyatakan bahawa rentetan tidak boleh diubah, bermakna setelah dibuat, kandungannya tidak boleh diubah. Ini menimbulkan percanggahan yang jelas kepada coretan kod berikut:
str := "hello" fmt.Printf("%p\n",&str) // 0x1040c128 fmt.Printf("%v\n",str) // hello ptr := &str *ptr = "world" fmt.Printf("%p\n",&str) // 0x1040c128 fmt.Printf("%v\n",str) // world
Jika rentetan tidak boleh diubah, mengapakah menukar nilai penuding yang diberikan kepada str turut mengubah nilai str?
Perbezaan utama di sini ialah antara nilai rentetan dan pembolehubah rentetan. str ialah pembolehubah jenis rentetan. Apabila anda menggunakan pengendali tugasan (=) pada str, anda menukar nilai pembolehubah str, bukan nilai rentetan yang dirujuk oleh str.
Dalam Go, nilai rentetan diwakili oleh pantulan. StringHeader struct, yang mengandungi penunjuk kepada data dan panjangnya. Setelah dibuat, struct ini tidak boleh diubah suai.
Operator & mengembalikan alamat pembolehubah, bukan nilai pembolehubah. Oleh itu, &str mengembalikan alamat pembolehubah str, bukan alamat nilai rentetan yang dirujuk oleh str.
Apabila anda menggunakan pernyataan ptr := &str, anda sedang mencipta penunjuk kepada pembolehubah str. Menetapkan nilai baharu kepada *ptr mengubah nilai pembolehubah str, tetapi ia tidak mengubah nilai rentetan yang dirujuk oleh str.
Dalam Go, nilai rentetan tidak boleh diubah . Walau bagaimanapun, pembolehubah rentetan boleh diubah suai, yang secara tidak langsung boleh mengubah nilai rentetan yang dirujuk oleh pembolehubah itu.
Atas ialah kandungan terperinci Mengapa Menukar Penunjuk Rentetan Nampaknya Mengubah Suai Rentetan Tidak Boleh Berubah dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!