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 关于全局变量的坑
May 06 Golang
go 实现简易端口扫描的示例
May 22 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang 实现WebSockets
Apr 24 Golang
Golang入门之计时器
May 04 Golang
Golang并发工具Singleflight
May 06 Golang
Go语言测试库testify使用学习
Jul 23 Golang
Go gorilla/sessions库安装使用
Aug 14 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开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
PHP实现单例模式最安全的做法
2014/06/13 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
jquery cookie的用法总结
2013/11/18 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
Python字符串替换实例分析
2015/05/11 Python
以windows service方式运行Python程序的方法
2015/06/03 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
python中dict()的高级用法实现
2019/11/13 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
北大自主招生自荐信
2013/10/19 职场文书
机械设计职业生涯规划书
2013/12/27 职场文书
大型车展策划方案
2014/02/01 职场文书
《植物妈妈有办法》教学反思
2014/02/25 职场文书
保护水资源的标语
2014/06/17 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
团队拓展训练感想
2015/08/07 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
入门学习Go的基本语法
2021/07/07 Golang
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS