Rumah >pembangunan bahagian belakang >Golang >Mengapa Menukar Nilai Rentetan melalui Penunjuk dalam Go Tidak Menukar Alamat Memorinya?

Mengapa Menukar Nilai Rentetan melalui Penunjuk dalam Go Tidak Menukar Alamat Memorinya?

DDD
DDDasal
2024-12-13 07:33:10986semak imbas

Why Does Changing a String's Value via a Pointer in Go Not Change Its Memory Address?

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!

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