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缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
Golang 编译成DLL文件的操作
May 06 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang日志包的使用
Apr 20 Golang
Go web入门Go pongo2模板引擎
May 20 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
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
php报错502badgateway解决方法
2019/10/11 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
python字符串排序方法
2014/08/29 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
中秋节超市促销方案
2014/01/30 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
志愿者活动总结范文
2014/04/26 职场文书
公开承诺书格式
2014/05/21 职场文书
食品安全承诺书
2014/05/22 职场文书
超市理货员岗位职责
2014/07/04 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
民事诉讼代理词
2015/05/25 职场文书
母亲去世追悼词
2015/06/23 职场文书
结婚主持人致辞
2015/07/28 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server