将切片元素展开作为可变参数(不定参数)入参

package main

import (
   "fmt"
)

func main() {
   var slice []any
   slice = append(slice, "张三")
   slice = append(slice, "男")
   slice = append(slice, 18)

   fmt.Println(slice) // [张三 男 18]

   // 可以看到两种方式打印出来的内容是一样的
   fmt.Println(slice[0], slice[1], slice[2]) // 张三 男 18
   fmt.Println(slice...)                     // 张三 男 18
}

//========== 总结 ==========//
// 1、切片变量名后面跟三个小数点的效果是把切片所有元素展开,在调用某些有不定形
//    参的方法时,使用这种方式将切片展开作为不定参数入参会使代码变得非常简洁。



  在某些情况下,如果函数的形参是切片类型,也可以改写为可变参数(不定参数),如下面的代码:

package main

import (
   "fmt"
)

// Iterator1
// @description 遍历切片
// @param names []string 切片
func Iterator1(names []string) {
   for _, name := range names {
      fmt.Printf("%+v ", name)
   }
}

// Iterator2
// @description 遍历可变参数
// @param names ...string 可变参数,重要说明:在这种情况下 ...string 其实就是 []string
func Iterator2(names ...string) {
   for _, name := range names {
      fmt.Printf("%+v ", name)
   }
}

func main() {
   // 以切片类型入参
   Iterator1([]string{"刘一", "陈二", "张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"})
   // 刘一 陈二 张三 李四 王五 赵六 孙七 周八 吴九 郑十

   fmt.Println()

   // 以可变参数入参
   Iterator2("刘一", "陈二", "张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十")
   // 刘一 陈二 张三 李四 王五 赵六 孙七 周八 吴九 郑十

   fmt.Println()

   // 虽然Iterator2()的形参是可变参数,但是在实参后面加三个小数点也可以入参
   Iterator2([]string{"刘一", "陈二", "张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"}...)
   // 刘一 陈二 张三 李四 王五 赵六 孙七 周八 吴九 郑十
}

// ========== 总结 ========== //
// 1、如果一个函数的形参可以设计为切片,也可以设计为可变参数,那么应该优先设计为可变参数,因为可变参数可以兼容切片(反之则
//    不行),只要在切片变量后面加三个小数点就可以作为可变参数入参。
// 2、函数的形参可以同时使用固定参数和可变参数,前提是可变参数必须放在形参列表最后,即作为最后一个参数。

Copyright © 2024 码农人生. All Rights Reserved