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 24 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 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
一个用于网络的工具函数库
2006/10/09 PHP
PHP可变函数学习小结
2015/11/29 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
JS 自动安装exe程序
2008/11/30 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
js倒计时小程序
2013/11/05 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
jQuery设计思想
2017/03/07 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
Python 异常处理的实例详解
2017/09/11 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
毕业生教师求职信
2013/10/20 职场文书
护士专业推荐信
2013/11/02 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
走群众路线学习笔记
2014/11/06 职场文书
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL
Python 数据可视化之Matplotlib详解
2021/11/02 Python
Win2008系统搭建DHCP服务器
2022/06/25 Servers