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 21 Golang
golang判断key是否在map中的代码
Apr 24 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
两种设置php载入页面时编码的方法
2014/07/29 PHP
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
webpack构建的详细流程探底
2018/01/08 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
使用Python抓取模板之家的CSS模板
2015/03/16 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
基于python的Paxos算法实现
2019/07/03 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
名企HR怎样看待求职信
2014/02/23 职场文书
奥运会口号
2014/06/13 职场文书
服务理念标语
2014/06/18 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
新农村建设汇报材料
2014/08/15 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL
什么是SOLID
2022/03/24 Javascript