Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Penegasan Jenis Boleh Dilakukan dalam Go dengan Antara Muka Tidak Diketahui?
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!