go语言中模拟函数重载
go语言不允许在同一个作用域下定义名字相同但函数原型不同的函数。在其他语言中(如C++),这种在同一声明域中函数名字相同但参数列表不同的函数被称为函数重载。
在go语言中我们可以使用变长参数函数模拟函数重载。如果要重载的函数的参数类型都相同仅参数的个数是变化的,那么使用变长参数函数即可。如果函数的参数类型不同且参数个数是变化的,还要结合interface{}类型的特性。
func concatArgs(sep string, args ...interface{}) string {
var result string
for i, v := range args {
if i != 0 {
result += sep
}
switch v.(type) {
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
result += fmt.Sprintf("%d", v)
case string:
result += fmt.Sprintf("%v", v)
case []int:
s := v.([]int)
for i, v := range s {
if i != 0 {
result += sep
}
result += fmt.Sprintf("%d", v)
}
case []string:
s := v.([]string)
result += strings.Join(s, sep)
default:
fmt.Println("the argument type [%T] is not supported.", v)
return ""
}
}
return result
}
func main() {
fmt.Println(concatArgs("-", 1))
fmt.Println(concatArgs("-", 1, 2, 3))
fmt.Println(concatArgs("-", []string{"hello", "world", "!"}))
fmt.Println(concatArgs("-", "test", 1, uint32(5), []int{11, 12, 13}),
14, []string{"imitate", "go", "overload"}, "testing", 20)
}
输出结果:
1 1-2-3 hello-world-! test-1-5-11-12-13 14 [imitate go overload] testing 20
从执行结果可以看到:concatArgs函数支持接受任意数量的整型、字符串、字符串切片、整型切片参数,并将参数通过sep拼接在一起,类似于重载函数的作用。
Go语言基础及实战 文章被收录于专栏
Go语言学习笔记、语法知识、技术要点和个人理解及实战
