Fork me on GitHub

Go可变参数函数

可变参数函数即其参数数量是可变的 : 0 个或多个;

声明可变参数函数的方式是在其参数类型前面带上省略符(…)前缀。

一个简单的可变参数函数:

1
2
3
4
5
6
7
func test(input …string) string {
return strings.Join(input,",")
}

test("hello","world")
test("single")
test()

可变参数函数会在其内部创建一个”新的临时切片”。事实上,可变参数是一个简化了切片类型参数传入的语法糖

当不传入参数的时候,可变参数会成为一个空值切片( nil )

当不太确定数据类型的时候我们通常采用空接口 interface{}

1
2
3
4
5
6
7
tests1(789)
fmt.Println("-------------")
tests1("789")
func tests1(arg interface{}) {
fmt.Println("value:", arg)
fmt.Println("type:", reflect.TypeOf(arg).Name())
}

输出结果

1
2
3
4
5
value: 789
type: int
-------------
value: 789
type: string

⚠️在使用interface{}作为可变入参时,传入的参数要先做类型转换(先转换为[ ]interface{})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)
}
}

s := []string{"4", "5", "6"}
var d []interface{}
d = append(d, s)
//或者
//var d []interface{} = []interface{}{s[0], s[1], s[2]}
testParams(d...)

结果:

1
2
3
4
0 []---- 4
1 []---- 5
2 []---- 6
0 [4 5 6]
您的鼓励是我持之以恒的动力