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 02 Golang
Golang 正则匹配效率详解
Apr 25 Golang
Golang: 内建容器的用法
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
入门学习Go的基本语法
Jul 07 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang日志包的使用
Apr 20 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Go语言编译原理之源码调试
Aug 05 Golang
基于Python实现西西成语接龙小助手
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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
Javascript 复制数组实现代码
2009/11/26 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
python和bash统计CPU利用率的方法
2015/07/10 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
Python基础之文件读取的讲解
2019/02/16 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
python word转pdf代码实例
2019/08/16 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
《夸父追日》教学反思
2014/02/26 职场文书
中职生求职信
2014/07/01 职场文书
优秀党员推荐材料
2014/12/18 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
倡议书的格式写法
2015/04/28 职场文书
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技