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 相关文章推荐
Golang二维切片初始化的实现
Apr 08 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 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
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
js数组的基本使用总结
2021/01/18 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
Python的gevent框架的入门教程
2015/04/29 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
python中get和post有什么区别
2020/06/19 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
Python绘制数码晶体管日期
2021/02/19 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
新加坡交友网站:be2新加坡
2019/04/10 全球购物
个人简历中的自我评价怎么写
2014/01/26 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
说明书格式及范文
2014/05/07 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
学习计划书怎么写
2014/09/15 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
python 详解turtle画爱心代码
2022/02/15 Python