如果函数的最后一个参数是采用 ...type 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变参函数。
示例函数和调用:
func myFunc(a, b, arg ...int) {} func Greeting(prefix string, who ...string) Greeting("hello:", "Joe", "Anna", "Eileen")
这里函数在定义参数时是who ...string , 调用时传递了3个string类型的参数,在函数内who是[]string类型 , 可以遍历who这个变量来拿到数据
如果一个变长参数的类型没有被指定,则可以使用默认的空接口 interface{},这样就可以接受任何类型的参数。该方案不仅可以用于长度未知的参数,还可以用于任何不确定类型的参数。一般而言我们会使用一个 for-range 循环以及 switch 结构对每个参数的类型进行判断
func checkNames(..,..,values … interface{}) { for _, value := range values { switch v := value.(type) { case int: … case float: … case string: … case bool: … default: … } } }
实际运用 , 在gorm的查询数据时 , 有使用变参函数 , 函数定义
func (s *DB) Select(query interface{}, args ...interface{}) *DB
函数使用时
db.Select("name, age").Find(&users) //// SELECT name, age FROM users; db.Select([]string{"name", "age"}).Find(&users) //// SELECT name, age FROM users; db.Table("users").Select("COALESCE(age,?)", 42).Rows() //// SELECT COALESCE(age,'42') FROM users;