Go 中可变参数函数的泛型编程
尽管 Go 缺乏模板和重载函数,但仍然可以实现某种形式的泛型编程对于可变参数函数。
考虑以下示例,其中包含一系列函数,这些函数从数据库检索值,并在请求的值丢失时返回默认值:
<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 }</code>
消除代码冗余,可以使用interface{}类型实现通用的Get()函数:
<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 0 } } return v }</code>
在客户端代码中,可以对返回值进行相应的类型转换:
<code class="go">value := document.Get("index", 1).(int) // Panics when the value is not int value, ok := document.Get("index", 1).(int) // ok is false if the value is not int</code>
但是,这种方法由于类型转换而引入了一些运行时开销。仍然建议考虑重构代码或针对不同类型使用单独的函数。
以上是如何在Go中实现可变参数函数的泛型编程?的详细内容。更多信息请关注PHP中文网其他相关文章!