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
Go缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
Go语言带缓冲的通道实现
Apr 26 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
golang slice元素去重操作
Apr 30 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 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
多重?l件?合查?(一)
2006/10/09 PHP
Banner程序
2006/10/09 PHP
php中用文本文件做数据库的实现方法
2008/03/27 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
两个php日期控制类实例
2014/12/09 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
js实现DOM走马灯特效的方法
2015/01/21 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
AOP的定义以及作用
2013/09/08 面试题
《孔子拜师》教学反思
2014/02/24 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
教师一帮一活动总结
2014/07/08 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
先进党员事迹材料
2014/12/24 职场文书
离婚协议书范本
2015/01/26 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
关于远足的感想
2015/08/10 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书