今天在尝试用go写一个简单的orm的时候 发现 在调用可变参数函数时,不是总能使用省略号将一个切片展开,有时候编译器可能会报错 再此用几个简单的例子做为说明app
当不太肯定数据类型的时候咱们一般采用空接口函数
tests1(789) fmt.Println("-------------") tests1("789")
func tests1(arg interface{}) { fmt.Println("value:", arg) fmt.Println("type:", reflect.TypeOf(arg).Name()) }
输出结果code
value: 789 type: int ------------- value: 789 type: string
在使用相同类型的可变入参时orm
tests([]string{"4", "5", "6"}...)
func tests(args ...string) { for i, v := range args { fmt.Println(i, "----", v) } }
输出结果接口
0 ---- 4 1 ---- 5 2 ---- 6
当使用interface{}做为可变入参时编译器
func testParams(args ...interface{}) { for i, v := range args { if s, ok := v.(string); ok { fmt.Println("----", s) } if s, ok := v.([]string); ok { for i, v := range s { fmt.Println(i, "[]----", v) } } fmt.Println(i, v) } }
出现错误string
cannot use []string literal (type []string) as type []interface {} in argument to testParams
当看到这里时候答案已经露出水面了
这里提供两种解决方案it
第一种方法编译
s := []string{"4", "5", "6"} var d []interface{} = []interface{}{s[0], s[1], s[2]} testParams(d...)
结果test
---- 4 0 4 ---- 5 1 5 ---- 6 2 6
第二种方法
s := []string{"4", "5", "6"} var d []interface{} d = append(d, s) testParams(d...)
结果
0 []---- 4 1 []---- 5 2 []---- 6 0 [4 5 6]
总结: 在使用interface{}做为可变入参时 传入的参数要作类型转换