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
Golang中interface{}转为数组的操作
Apr 30 Golang
golang 实现时间戳和时间的转化
May 07 Golang
Golang全局变量加锁的问题解决
May 08 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
Golang中异常处理机制详解
Jun 08 Golang
深入理解go slice结构
Sep 15 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
golang为什么要统一错误处理
Apr 03 Golang
Go 内联优化让程序员爱不释手
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
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
PHP 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
php中对2个数组相加的函数
2011/06/24 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
javascript 得到变量类型的函数
2010/05/19 Javascript
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
JS中作用域以及变量范围分析
2020/07/18 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
微信小程序canvas实现签名功能
2021/01/19 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
python复制文件代码实现
2013/12/23 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
Python编程求质数实例代码
2018/01/31 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
pytorch常见的Tensor类型详解
2020/01/15 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
旷课检讨书1000字
2014/02/14 职场文书
园艺师求职信
2014/04/27 职场文书
环境卫生整治简报
2015/07/20 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL