Argumentasi Variadik Generik dalam Go
Go kekurangan templat dan fungsi terlampau beban, tetapi ia menawarkan penyelesaian untuk mencapai persamaan pengaturcaraan generik dalam variadic fungsi.
Cabaran:
Banyak fungsi yang mempunyai struktur yang serupa, seperti:
<code class="go">func (this Document) GetString(name string, defaults ...string) string { v, ok := this.GetValueFromDb(name) if !ok { if len(defaults) >= 1 { return defaults[0] } else { return "" } } return v.asString } func (this Document) GetInt(name string, defaults ...int) int { v, ok := this.GetValueFromDb(name) if !ok { if len(defaults) >= 1 { return defaults[0] } else { return 0 } } return v.asInt } // etc. for various types</code>
Penyelesaian:
Menggunakan jenis antara muka{} mendayakan fungsi generik:
<code class="go">func (this Document) Get(name string, defaults ...interface{}) interface{} { v, ok := this.GetValueFromDb(name) if !ok { if len(defaults) >= 1 { return defaults[0] } else { return nil } } return v }</code>
Fungsi GetValueFromDb harus mengembalikan antara muka{} juga. Dalam kod pelanggan, nilai boleh ditukar dan dicapai menggunakan penegasan jenis:
<code class="go">value := document.Get("index", 1).(int) // Panics if the value is not an int</code>
atau
<code class="go">value, ok := document.Get("index", 1).(int) // ok is false if the value is not an int</code>
Walaupun ini memperkenalkan beberapa overhed masa jalan, penstrukturan semula kod dan fungsi pengasingan mungkin lebih cekap .
Atas ialah kandungan terperinci Bagaimana Boleh Mencapai Fungsi Variadik Generik Tanpa Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!