Skip to main content

golang函数可变数量参数传参

· 2 min read

开发过程中发现 fun(opts...) 的用法,于是学习函数可变数量参数传参

package main

import (
"fmt"
)

type Foo struct {
Number int
Text string
Name string
}

func print(list ...int) {
for index, a := range list {
fmt.Printf("%d: %v \n", index, a) // print 0:1 1:3 2:4
}
}

func main() {
arr := []int{1, 3, 4}
print(arr...)
}

如果是复杂的多种类型入参

涉及知识点

  1. 数组对象类型定义
  2. interface用法
  3. []interface{} 和 []T{}类型的区别

notices: a variable with type []interface{} is not an interface! 注意: 变量类型[]interface{} 不是 一个interface

package main

import (
"fmt"
)

type Foo struct {
Number int
Text string
Name string
}

func print(list ...interface{}) {
for index, a := range list {
fmt.Printf("%d: %v \n", index, a)
}
}

func main() {
arr := []Foo{{Number: 1, Text: "pie"}, {Name: "ssss", Number: 15, Text: "fish"}, {Number: 30, Text: "orange"}}
print(arr...) // compiler error: cannot use arr (variable of type []Foo) as []interface{}
}

[]Foo 并不能当成[]interface{}类型, 原因是[]Foo长度不固定 []interface{}编译时并不知道参数数量

参考文章1

参考文章2

修改后

package main

import (
"fmt"
)

type Foo struct {
Number int
Text string
Name string
}

func print(list ...interface{}) {
for index, a := range list {
fmt.Printf("%d: %v \n", index, a)
}
}

func main() {
arr := []Foo{{Number: 1, Text: "pie"}, {Name: "ssss", Number: 15, Text: "fish"}, {Number: 30, Text: "orange"}}
var interfaceSlice []interface{} = make([]interface{}, len(arr)) // 增加[]interface{}类型变量,并确定长度
for i, d := range arr {
interfaceSlice[i] = d
}
print(interfaceSlice...)
}