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 Gin实现文件上传下载的示例代码
Apr 02 Golang
go语言中fallthrough的用法说明
May 06 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
Golang中异常处理机制详解
Jun 08 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
golang中的struct操作
Nov 11 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
golang语言指针操作
Apr 14 Golang
Golang jwt身份认证
Apr 20 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Go web入门Go pongo2模板引擎
May 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+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
PHP Cookie学习笔记
2016/08/23 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
[JS]点出统计器
2020/10/11 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
跟老齐学Python之集合(set)
2014/09/24 Python
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
python文件名和文件路径操作实例
2017/09/29 Python
Python格式化输出%s和%d
2018/05/07 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
异步传递消息系统的作用
2016/05/01 面试题
酒店开业庆典主持词
2014/03/21 职场文书
人大调研汇报材料
2014/08/14 职场文书
优秀高中学生评语
2014/12/30 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby