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 Int转string几种方式性能测试
Apr 28 Golang
Go使用协程交替打印字符
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
golang 比较浮点数的大小方式
May 02 Golang
go设置多个GOPATH的方式
May 05 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Golang 入门 之url 包
May 04 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
在ubuntu下安装go开发环境的全过程
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
php导出word格式数据的代码实例
2013/11/25 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
利用Psyco提升Python运行速度
2014/12/24 Python
Python代码解决RenderView窗口not found问题
2016/08/28 Python
python re模块的高级用法详解
2018/06/06 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
教师党性分析材料
2014/02/04 职场文书
测绘工程专业求职信
2014/07/15 职场文书
妈妈活动方案
2014/08/15 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
java调用Restful接口的三种方法
2021/08/23 Java/Android