Penafian: Saya hanya bermain dengan Go untuk satu hari sekarang, jadi ada kemungkinan besar saya telah melewatkan banyak hal.
Adakah yang tahu mengapa tidak ada dukungan nyata untuk generik / templates / whatsInAName di Go? Jadi ada generik map
, tapi itu disediakan oleh compiler, sementara programmer Go tidak bisa menulis implementasinya sendiri. Dengan semua pembicaraan tentang membuat Go se-ortogonal mungkin, mengapa saya dapat MENGGUNAKAN tipe generik tetapi tidak MEMBUAT yang baru?
Terutama ketika datang ke pemrograman fungsional, ada lambda, bahkan closure, tetapi dengan sistem tipe statis yang tidak memiliki generik, bagaimana cara saya menulis, yah, fungsi generik tingkat tinggi filter(predicate, list)
? OK, daftar Linked dan sejenisnya bisa dilakukan dengan interface{}
mengorbankan keamanan tipe.
Karena pencarian cepat di SO / Google tidak mengungkapkan wawasan apa pun, sepertinya obat generik, jika ada, akan ditambahkan ke Go sebagai renungan. Saya percaya Thompson melakukan cara yang lebih baik daripada orang-orang Java, tetapi mengapa tidak menggunakan obat generik? Atau apakah sudah direncanakan dan belum diterapkan?
interface{}
mengorbankan keamanan tipe statis . Namun ini adalah keluhan yang agak aneh untuk dibuat ketika menyebutkan Skema adalah paragraf berikutnya, karena Skema biasanya tidak memiliki pemeriksaan tipe statis.Jawaban:
jawaban ini Anda akan temukan di sini: http://golang.org/doc/faq#generics
sumber
interface{}
, adalah tipe antarmuka paling dasar, dan setiap objek menyediakannya. Jika Anda membuat wadah yang menampungnya, ia dapat menerima objek (non-primitif) apa pun. Jadi sangat mirip dengan wadah penampungObjects
di Jawa.Lakukan 2
Ada rancangan rancangan untuk obat generik di https://blog.golang.org/go2draft .
Pergi 1
Russ Cox, salah satu veteran Go menulis posting blog berjudul The Generic Dilemma , di mana dia bertanya
Pemrogram yang lambat bukan hasil dari generik, kompiler lambat disebabkan oleh C ++ seperti generik dan waktu eksekusi yang lambat berasal dari pendekatan tinju-unboxing yang digunakan Java.
Kemungkinan keempat yang tidak disebutkan di blog adalah menempuh rute C #. Menghasilkan kode khusus seperti di C ++, tetapi pada waktu proses saat diperlukan. Saya sangat menyukainya, tapi Go sangat berbeda dengan C # jadi ini mungkin tidak berlaku sama sekali…
Saya harus menyebutkan bahwa menggunakan Java 1.4 yang populer seperti teknik pemrograman generik dalam perjalanan yang menyebabkan
interface{}
menderita masalah yang persis sama dengan tinju-unboxing (karena itulah yang kami lakukan), selain hilangnya keamanan jenis waktu kompilasi. Untuk tipe kecil (seperti int) Go mengoptimalkaninterface{}
tipe sehingga daftar int yang ditransmisikan ke antarmuka {} menempati area memori yang berdekatan dan hanya membutuhkan ruang dua kali lebih banyak dari int normal. Namun, masih ada overhead pemeriksaan runtime saat melakukan transmisiinterface{}
. Referensi .Semua project yang menambahkan dukungan generik (ada beberapa di antaranya dan semuanya menarik) secara seragam mengikuti rute C ++ untuk pembuatan kode waktu kompilasi.
sumber
[]interface{}
menggunakan 2x RAM sebagai[]int
. Meskipun benar, jenis yang lebih kecil (yaitu byte) menggunakan hingga 16x RAM sebagai[]byte
.Meskipun generik saat ini tidak ada di dalamnya, ada beberapa implementasi eksternal generik untuk go, yang menggunakan komentar dalam kombinasi dengan utilitas kecil yang menghasilkan kode.
Berikut adalah salah satu penerapannya: http://clipperhouse.github.io/gen/
sumber
Sebenarnya menurut postingan ini :
sumber
Polimorfisme parametrik (generik) adalah dipertimbangkan untuk Go 2 .
Pendekatan ini akan memperkenalkan konsep kontrak , yang dapat digunakan untuk mengekspresikan batasan pada parameter tipe:
Kontrak semacam itu kemudian dapat digunakan sebagai berikut:
Ini adalah proposal pada tahap ini.
filter(predicate, list)
Fungsi Anda dapat diimplementasikan dengan parameter tipe seperti ini:Dalam hal ini, tidak perlu ada batasan
T
.sumber