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结构体嵌套的切片数组操作
Apr 28 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
go语言中fallthrough的用法说明
May 06 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Golang 链表的学习和使用
Apr 19 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
GO中sync包自由控制并发示例详解
Aug 05 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
很实用的一个完整email发送程序
2006/10/09 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
详解JS函数重载
2014/12/04 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python监控文件或目录变化
2016/06/07 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
python远程邮件控制电脑升级版
2019/05/23 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
大学生的自我鉴定范文
2014/01/21 职场文书
城建学院毕业生自荐信
2014/01/31 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
中学生寄语大全
2014/04/03 职场文书
抽样调查项目计划书
2014/04/24 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
孔繁森观后感
2015/06/10 职场文书
初中班主任教育随笔
2015/08/15 职场文书