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 02 Golang
win10下go mod配置方式
Apr 25 Golang
go类型转换及与C的类型转换方式
May 05 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go归并排序算法的实现方法
Apr 06 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
Go语言编译原理之变量捕获
Aug 05 Golang
Go gorilla/sessions库安装使用
Aug 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
在同一窗体中使用PHP来处理多个提交任务
2008/05/08 PHP
PHP查询分页的实现代码
2017/06/09 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
react同构实践之实现自己的同构模板
2019/03/13 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
详解vue实现坐标拾取器功能示例
2020/11/18 Vue.js
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Apache如何部署django项目
2017/05/21 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
物流经理自我评价
2013/09/23 职场文书
护士求职信范文
2014/05/24 职场文书
新农村建设典型材料
2014/05/31 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python
Golang 字符串的常见操作
2022/04/19 Golang
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS
源码安装apache脚本部署过程详解
2022/09/23 Servers