Prinsip Pelaksanaan Jenis
Sebagai bahasa ditaip secara statik, Golang menyediakan ciri yang sangat berkuasa - antara muka. Ia bukan sahaja membantu pembangun mencapai kebolehgunaan semula kod, tetapi juga membolehkan kami melanjutkan fungsi program tanpa memusnahkan struktur kod.
Di Golang, antara muka ialah jenis, tetapi tidak seperti jenis lain, jenis antara muka boleh mengandungi set pengisytiharan kaedah tanpa melaksanakan kaedah ini. Ini memberi kita fleksibiliti yang hebat. Dengan mentakrifkan jenis antara muka, kita boleh mentakrifkan kaedah panggilan kaedah umum, dan kaedah panggilan ini dikaitkan dengan jenis antara muka dan tiada kaitan dengan jenis pelaksanaan.
Jadi, apabila kita menggunakan jenis antara muka, bagaimanakah Golang menukarnya kepada jenis pelaksanaan? Sebelum memahami prinsip pelaksanaan asas ini, mari kita fahami konsep asas jenis dan jenis antara muka di Golang.
Jenis dan jenis antara muka di Golang
Jenis dalam Golang boleh dibahagikan kepada dua kategori: jenis nilai dan jenis rujukan.
Jenis nilai bermaksud pembolehubah disimpan terus dalam ingatan, manakala jenis rujukan bermaksud pembolehubah menyimpan penunjuk ke objek lain dalam ingatan. Untuk jenis nilai, ia boleh dibandingkan secara langsung, manakala untuk jenis rujukan, perbandingan perlu dilakukan menggunakan fungsi kesetaraan.
Di Golang, kami boleh menggunakan jenis antara muka untuk mewakili semua jenis. Antara muka ialah jenis yang sangat fleksibel kerana ia boleh mewakili sebarang jenis nilai data. Nilai antara muka boleh menyimpan sebarang data yang melaksanakan nilai antara muka. Oleh itu, jenis antara muka boleh digunakan untuk menghantar jenis data sewenang-wenangnya kepada fungsi atau untuk menyimpan data objek tanpa mengetahui jenis objek tertentu.
Hubungan antara jenis dan jenis antara muka
Di Golang, sesuatu jenis boleh melaksanakan satu atau lebih antara muka. Jenis yang melaksanakan semua kaedah dalam antara muka dianggap sebagai instantiasi antara muka. Jenis ini boleh digunakan sebagai jenis pembolehubah yang melaksanakan antara muka ini.
Sebagai contoh, kami mempunyai jenis antara muka yang dipanggil Pembentuk, yang mempunyai kaedah yang dipanggil Kawasan():
taip antara muka Pembentuk {
Area() float64
}
Kita boleh mencipta jenis Square supaya ia melaksanakan kaedah Area() antara muka Shaper:
type Square struct {
side float64
}
func (s *Square ) Area() float64 {
return s.side * s.side
}
Dengan cara ini, kita boleh menjadikan jenis Square sebagai contoh jenis Shaper. Jika kita ingin mengira luas jenis Square, kita boleh menggunakan kaedah Area() bagi jenis Shaper untuk mendapatkan nilai kawasan:
func main() {
square := &Square{10.0} fmt.Println("Area of square:", square.Area())
}
Di sini, kita dapat melihat bahawa jenis Square melaksanakan kaedah Area() bagi jenis Shaper, jadi ia boleh digunakan sebagai contoh jenis Shaper. Jenis antara muka boleh menyediakan kaedah Area() am di sini untuk mengira pelbagai jenis kawasan, dan pelaksanaan kaedah Area() ini ditentukan oleh jenis pelaksanaan.
Mengapa penegasan jenis diperlukan?
Sekarang kita telah memahami asas jenis dan jenis antara muka, mari kita lihat cara Golang menukar jenis antara muka kepada jenis pelaksanaan.
Apabila kita mencipta pembolehubah jenis antara muka, ia sebenarnya adalah struktur data yang mengandungi dua bahagian: penunjuk kepada jadual kaedah (Jadual Kaedah, juga dipanggil jadual maya atau Vtable) dan penunjuk kepada pelaksanaan Penunjuk kepada nilai antara muka ini. Jadual kaedah ialah senarai semua penunjuk fungsi kaedah, setiap penunjuk dikaitkan dengan nama kaedah dan jenis.
Apabila kita memanggil kaedah jenis antara muka, Golang mula-mula akan menyemak sama ada kaedah itu berada dalam jadual kaedah, dan kemudian memanggil kaedah yang sepadan. Biasanya, Golang menggunakan penerima penunjuk untuk melaksanakan jenis antara muka, kerana kaedah ini lebih cekap daripada penerima nilai dan boleh menghalang pemanggil daripada mengubah suai medan jenis nilai.
Tetapi kadangkala, apabila kita menggunakan jenis antara muka, kita perlu menukarnya kepada jenis pelaksanaan Dalam kes ini, kita perlu menggunakan penegasan jenis. Penegasan jenis ialah operasi yang menentukan sama ada penukaran jenis boleh dilaksanakan dengan menilai sama ada jenis antara muka melaksanakan jenis sasaran. Jika penghakiman berjaya, penegasan jenis akan mengembalikan nilai yang mewakili jenis sasaran, jika tidak, ia akan mengembalikan nilai sifar dan membuang pengecualian. Oleh itu, sebelum membuat penegasan jenis, kita perlu menggunakan nilai pulangan kedua dalam penegasan jenis untuk membuat pertimbangan yang selamat untuk mengelakkan pengecualian.
Kod berikut menunjukkan cara menukar jenis antara muka kepada jenis pelaksanaan:
func main() {
var shaper Shaper square := &Square{10.0} shaper = square //将square类型转换成Shaper类型 s := shaper.(*Square) //将shaper类型转换成Square类型 fmt.Println("Square side length:", s.side)
}
Di sini, Dengan menugaskan nilai jenis Square kepada pembolehubah jenis Shaper, kami menukar jenis Square kepada jenis Shaper. Apabila kita perlu menukarnya semula, kita boleh menggunakan penegasan jenis untuk menukar jenis Pembentuk kepada jenis Petak.
Ringkasan
Jenis antara muka ialah konsep yang sangat penting dalam Golang, yang boleh meningkatkan kebolehgunaan semula dan kebolehskalaan kod. Di Golang, dengan bantuan jenis antara muka dan penegasan jenis, kita boleh menukar jenis antara muka kepada jenis pelaksanaan. Walaupun penegasan jenis membawa fleksibiliti yang lebih besar, anda perlu memberi perhatian kepada keselamatan penukaran jenis semasa digunakan untuk mengelakkan pengecualian.
Atas ialah kandungan terperinci pemindahan antara muka golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!