Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Penegasan Jenis Boleh Dilakukan dalam Go dengan Antara Muka Tidak Diketahui?

Bagaimanakah Penegasan Jenis Boleh Dilakukan dalam Go dengan Antara Muka Tidak Diketahui?

DDD
DDDasal
2024-11-26 09:19:09807semak imbas

How Can Type Assertion Be Performed in Go with Unknown Interfaces?

Taip Penegasan dalam Go for Unknown Interfaces

Proses mendapatkan semula nilai objek melalui refleksi dan melakukan penegasan jenis untuk mendapatkan objek sebenar menggunakan kaedah seperti:

obj := new(User)
out := reflect.ValueOf(obj).Elem().Interface().(User)
fmt.Println(out == *obj) // true

adalah terkenal. Walau bagaimanapun, cabaran timbul apabila jenis objek tidak diketahui terlebih dahulu. Pertimbangkan fungsi yang menerima antara muka yang tidak diketahui:

func Foo(obj interface{}) bool {
    // out := reflect.ValueOf(obj).Elem().Interface().( ... )
    return out == *obj
}

func main() {
    obj := new(User)
    fmt.Println(Foo(obj))
}

Dalam fungsi Foo, menentukan jenis objek yang dihantar masuk adalah tidak mungkin. Ini menimbulkan persoalan: bagaimanakah penegasan jenis boleh dilakukan dalam senario sedemikian?

Jawapannya terletak pada sifat penegasan jenis. Penegasan jenis membenarkan leverage semakan jenis statik dalam Go walaupun semasa bekerja dengan antara muka yang jenisnya tidak boleh disahkan secara statik. Kefungsian ini beroperasi pada prinsip berikut:

Memandangkan pembolehubah ditaip statik s jenis t, pengkompil memastikan bahawa s sentiasa kekal daripada jenis t. Ia menolak kompilasi jika s digunakan sebagai jenis yang berbeza, kerana ini akan melanggar jaminan yang ditetapkan.

Sekarang, bayangkan pembolehubah antara muka i. Oleh kerana jenisnya tidak dapat diketahui pada masa penyusunan, pengkompil tidak dapat menjamin bahawa memberikan i kepada s tidak akan memecahkan jaminan bahawa s adalah jenis t. Penegasan jenis mengatasi isu ini dengan menyatakan, "Kami akan mengesahkan pada masa jalankan jika jenis sepadan dan melaksanakan tugasan hanya apabila mereka melakukannya." Pengkompil meluluskan pendekatan ini kerana ia percaya bahawa tugasan hanya akan berlaku apabila jenisnya serasi, sekali gus mengekalkan jaminan s jenis t.

Pada asasnya, ini bermakna perkara berikut berlaku semasa masa jalan:

if (i has type t) {
    s = i
} else {
    s = t{} // Zero value of t
}

Kemustahilan fungsi yang diminta timbul daripada keperluan untuk pengkompil mengetahui jenis yang akan digunakan untuk melakukan semakan. Tanpa pengetahuan ini, jenis statik s tidak dapat ditentukan, menyebabkan proses pengesahan tidak dapat dilaksanakan.

Atas ialah kandungan terperinci Bagaimanakah Penegasan Jenis Boleh Dilakukan dalam Go dengan Antara Muka Tidak Diketahui?. 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