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 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
Go timer如何调度
Jun 09 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Go语言基础知识点介绍
Jul 04 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
golang为什么要统一错误处理
Apr 03 Golang
Go获取两个时区的时间差
Apr 20 Golang
Python测试框架pytest核心库pluggy详解
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中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
PHP常用数组函数介绍
2014/07/28 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
早该知道的7个JavaScript技巧
2013/03/27 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
python解析json实例方法
2013/11/19 Python
Python的Django中django-userena组件的简单使用教程
2015/05/30 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
Python实现调度算法代码详解
2017/12/01 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
python中round函数如何使用
2020/06/19 Python
Python join()函数原理及使用方法
2020/11/14 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
中学老师的自我评价
2013/11/07 职场文书
大学军训感言200字
2014/02/26 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
如何写股份合作协议书
2014/09/11 职场文书
高中政治教学反思
2016/02/23 职场文书
新手入门Mysql--概念
2021/06/18 MySQL
配置Kubernetes外网访问集群
2022/03/31 Servers