Rumah >pembangunan bahagian belakang >Golang >Mengapa Menukar Nilai Rentetan melalui Penunjuk dalam Go Tidak Menukar Alamat Memorinya?
Nilai Rentetan Kekal dan Alamat Penunjuk
Dalam Go, spesifikasi rasmi menyatakan bahawa rentetan tidak boleh diubah, bermakna kandungannya tidak boleh diubah setelah dibuat . Walau bagaimanapun, pemerhatian yang pelik timbul daripada 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
Bertentangan dengan jangkaan, selepas menetapkan "dunia" pada penunjuk yang dinyahrujuk *ptr, alamat &str kekal tidak berubah.
Fenomena ini memerlukan pemahaman tentang apa yang dimaksudkan dengan "ketidakbolehubah" dalam konteks ini. Nilai rentetan dalam Go adalah tidak berubah, bukan pembolehubah yang memegangnya. Dalam sampel kod, str ialah pembolehubah jenis rentetan dan nilainya boleh ditukar.
Nilai rentetan "hello" itu sendiri tidak boleh diubah. Menetapkan "dunia" kepada str tidak mengubah "hello" tetapi hanya menukar nilai pembolehubah str kepada "dunia." Perubahan ini tidak bergantung pada cara nilai ditetapkan, sama ada secara langsung atau melalui penuding.
Nilai rentetan tidak berubah memastikan rentetan kongsi kekal konsisten sepanjang program. Sebagai contoh, jika fungsi menerima hujah rentetan, nilainya tidak boleh diubah dalam fungsi tersebut. Oleh itu, penyataan cetakan berikutnya dengan nilai rentetan yang sama akan sentiasa menghasilkan hasil yang dijangkakan.
Secara dalaman, nilai rentetan diwakili oleh reflect.StringHeader struct. Struktur ini menyimpan penunjuk kepada nilai yang dikodkan UTF-8 bagi teks dan panjang baitnya. Data ini tidak boleh diakses, menghalang pengubahsuaian langsung. Selain itu, nilai rentetan tidak boleh diindeks dan diberikan nilai baharu.
Walaupun spesifikasi Go menjamin kebolehubahan nilai rentetan, menggunakan pakej yang tidak selamat boleh mengatasi jaminan ini. Walau bagaimanapun, berbuat demikian melepaskan perlindungan dan keselamatan yang disediakan oleh spesifikasi bahasa.
Atas ialah kandungan terperinci Mengapa Menukar Nilai Rentetan melalui Penunjuk dalam Go Tidak Menukar Alamat Memorinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!