Menetapkan Antara Muka kepada Sifar dalam Golang
Dalam Golang, nilai antara muka mewakili gelagat objek, tetapi ia bukan objek sebenar itu sendiri. Apabila cuba menghilangkan nilai dalaman antara muka, anda sebenarnya berurusan dengan penuding kepada jenis konkrit, yang berbeza daripada nilai antara muka.
Tiada Antara Muka
Jika anda mempunyai antara muka yang nilainya ingin anda tetapkan kepada sifar, gunakan fungsi berikut:
<code class="go">func setNilIf(v *interface{}) { *v = nil }</code>
Contoh:
<code class="go">var i interface{} = "Bob" fmt.Printf("Before: %v\n", i) setNilIf(&i) fmt.Printf("After: %v\n", i)</code>
Output:
Before: Bob After: <nil>
Tiada Penunjuk
Dalam kes anda, anda berurusan dengan penuding kepada jenis konkrit. Untuk menghilangkan penunjuk, anda boleh menggunakan:
Menggunakan Tidak Selamat.Penunjuk:
<code class="go">func setNilPtr(p unsafe.Pointer) { *(**int)(p) = nil }</code>
Contoh:
<code class="go">type TYP struct { InternalState string } typ := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ) setNilPtr(unsafe.Pointer(&typ)) fmt.Printf("After: %v\n", typ)</code>
Output:
Before: &{filled} After: <nil>
Menggunakan Refleksi:
<code class="go">func setNilPtr2(i interface{}) { v := reflect.ValueOf(i) v.Elem().Set(reflect.Zero(v.Elem().Type())) }</code>
Contoh:
<code class="go">typ2 := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ2) setNilPtr2(&typ2) fmt.Printf("After: %v\n", typ2)</code>
Output:
Before: &{filled} After: <nil>
Nota:
Untuk kesederhanaan, secara amnya disyorkan untuk memberikan sifar terus kepada pembolehubah penunjuk, daripada menggunakan kaedah yang kompleks seperti di atas.
Atas ialah kandungan terperinci Cara Menetapkan Antara Muka kepada Tiada di Golang: Apakah Perbezaan Antara Tiada Penunjuk dan Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!