Golang 如何实现函数的任意类型传参


Posted in Golang onApril 29, 2021

大家还是直接看代码吧~

package main 
import (
	"fmt"
)
 
func init() {
	fmt.Print("init")
}
 
func main() {
	test1("123")
	test1(1)
	test2("123",1, "324", 12)
}
 
// 实现传单个任何类型的参数
 
func test1(v interface{}) {
	fmt.Println(v)                  // 打印 “123” 1
}
 
// 实现传任意多个任意类型的参数
 
func test2(v ...interface{}) {
	for _, m := range v {
		fmt.Println(m)				// 依次打印 123 1 324 12
	}
}

补充:golang 函数作为参数传递(回调)的例子

和其他很多语言一样,golang中函数也可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调。

语法:

以函数签名作为主调函数的形参的类型,即传递一个指向函数的指针

func main() {
    sayhello("john", addperfix)
}
func addperfix(perfix, name string) {
    fmt.Println(perfix, "!", name)
}
func sayhello(name string, f func(string, string)) {
    f("hello", name)
}

Golang 如何实现函数的任意类型传参

补充:golang函数形参接收任意类型的切片

在某些情况下一个函数可能既需要接收[]string类型的切片也可能接收[]int类型的切片,或接收自定义类型的切片。

我首先想到的办法是创建一个[]interface{}类型的切片

如下所示:

func demo(s []interface{}) {
 for _, ele := range s {
  fmt.Println(ele)
 }
}
func Test(t *testing.T) {
 s := []int{1, 2, 3}
 demo(s)
}

但不幸的是,我得到了

cannot use s (type []int) as type []interface {} in argument to demo 这个错误。

原因是interface{}类型的变量可以指向任意类型的值,但[]interface{}类型的指针只能指向[]interface{}类型的值而不能指向任意类型的切片。

为了实现上述功能,我想到的办法是利用反射中的Slice:

func demo(s interface{}) {
 sv := reflect.ValueOf(s)
 svs := sv.Slice(0, sv.Len())
 for i := 0; i < svs.Len(); i++ {
  e := svs.Index(i).Interface()
  switch e.(type) {
  case string:
   fmt.Println("string", e)
  case int:
   fmt.Println("int", e)
  }
 }
}
func Test(t *testing.T) {
 s1 := []int{1, 2, 3}
 demo(s1)
 s2 := []string{"a", "b", "c"}
 demo(s2)
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
彻底理解golang中什么是nil
Apr 29 Golang
golang elasticsearch Client的使用详解
May 05 Golang
go类型转换及与C的类型转换方式
May 05 Golang
go语言中fallthrough的用法说明
May 06 Golang
golang中的并发和并行
May 08 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Go 中的空白标识符下划线
Mar 25 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Golang日志包的使用
Apr 20 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 #Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 #Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 #Golang
Go使用协程交替打印字符
Apr 29 #Golang
golang goroutine顺序输出方式
Apr 29 #Golang
golang 在windows中设置环境变量的操作
解决golang在import自己的包报错的问题
You might like
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
JavaScript动态插入script的基本思路及实现函数
2013/11/11 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
python制作最美应用的爬虫
2015/10/28 Python
理解Python中的With语句
2016/03/18 Python
python实现FTP服务器服务的方法
2017/04/11 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
利用Python计算KS的实例详解
2020/03/03 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
五年后的职业生涯规划
2014/03/04 职场文书
捐款倡议书
2014/04/14 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
新学期开学标语2015
2015/07/16 职场文书
清明节主题班会
2015/08/14 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书