Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara Menetapkan Antara Muka kepada Tiada di Golang: Apakah Perbezaan Antara Tiada Penunjuk dan Antara Muka?

Cara Menetapkan Antara Muka kepada Tiada di Golang: Apakah Perbezaan Antara Tiada Penunjuk dan Antara Muka?

Susan Sarandon
Susan Sarandonasal
2024-10-31 10:08:02138semak imbas

How to Set an Interface to Nil in Golang: What's the Difference Between Nil a Pointer and an Interface?

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!

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