golang 没有名字参数_在 Golang 中用名字调用函数
上个星期,我写了篇《Function call by name in Golang》。由于是英文的,所以被人诟病(说谁,谁知道!)。好吧,现在用中文重新写一遍。
Golang 中的函数跟 C 的一样,是个代码块,不过它可以像其他类型那样赋值给一个变量。
首先,来看看这段 PHP 代码:
functionfoobar() {
echo"Hello Golang\n";
}
$funcs=array(
"foobar"=>"foobar",
"hello" =>"foobar",
);
$funcs["foobar"]();
$funcs["hello"]();
它会输出:
mikespook@mikespook-laptop:~/Desktop$ php foobar.php
Hello Golang
Hello Golang
用这个方法调用匹配名字的函数,非常有效。
那么,在 Golang 中是否可能用函数的名字来调用某个函数呢?
作为一个静态、编译型语言,答案是否定的……又是肯定的!
在 Golang 中,你不能这样做:
func foobar() {
// bla...bla...bla...
}
funcname :="foobar"
funcname()
不过可以:
func foobar() {
// bla...bla...bla...
}
funcs := map[string]func() {"foobar":foobar}
funcs["foobar"]()
但这里有一个限制:这个 map 仅仅可以用原型是“func()”的没有输入参数或返回值的函数。
如果想要用这个方法实现调用不同函数原型的函数,需要用到 interface{}。
是啊!interface{},跟 C 中的 void 指针类似。还记得这个东西吗?不记得了?没事,看看这个吧:《The Go Programming Language Specification:Interface types》。
这样,就可以添加有着不同函数原型的函数到一个 map 中:
func foo() {
// bla...bla...bla...
}
func bar(a, b, cint) {
// bla...bla...bla...
}
funcs := map[string]interface{}{"foo":foo,"bar":bar}
那么如何调用 map 中的函数呢?像这样吗:
funcs["foo"]()
绝对不行!这无法工作!你不能直接调用存储在空接口中的函数。
反射走进我们的生活!在 Golang 中有着叫做“reflect”的包。你是否了解反射了呢?
如果还没有,那么阅读一下这个:《Laws of reflection》吧。哦,这里有个中文版本:《反射的规则》。
func Call(m map[string]interface{}, name string, params ... interface{}) (result []reflect.Value, err error) {
f = reflect.ValueOf(m[name])
iflen(params) != f.Type().NumIn() {
err = errors.New("The number of params is not adapted.")
return
}
in := make([]reflect.Value, len(params))
fork, param := range params {
in[k] = reflect.ValueOf(param)
}
result = f.Call(in)
return
}
Call(funcs,"foo")
Call(funcs,"bar", 1, 2, 3)
将函数的值从空接口中反射出来,然后使用 reflect.Call 来传递参数并调用它。
没有什么是很难理解的。
希望这有些帮助。好运,地鼠们!
golang 没有名字参数_在 Golang 中用名字调用函数相关推荐
- golang 函数传多个参数_关于Golang中方法参数的传递
结构体声明 为了说明函数以及方法调用的过程,这里先定义一个struct,在下面的描述中会使用到它. type Person struct { Name string Age uint16 } 普通函数 ...
- python 函数调用 不允许关键字参数_你所不知道的Python|函数参数的演进之路
原标题:你所不知道的Python|函数参数的演进之路 函数参数处理机制是Python中一个非常重要的知识点,随着Python的演进,参数处理机制的灵活性和丰富性也在不断增加,使得我们不仅可以写出简化的 ...
- python中什么是关键字参数_如何使用python语言中函数的关键字参数的用法
一般情况下,在调用函数时,使用的是位置参数,即是按照参数的位置来传值:关键字参数是按照定义函数传入的参数名称来传值的.那么,关键字参数怎么使用? 工具/原料 python pycharm 截图工具 W ...
- python数据参数_零基础学习python数据分析——函数的参数
原标题:零基础学习python数据分析--函数的参数 上一节课中我们讲了python的函数定义,Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数 ...
- golang 获取struct类型_聊聊golang的类型断言
序 本文主要研究一下golang的类型断言 类型断言 x.(T) 断言x不为nil且x为T类型 如果T不是接口类型,则该断言x为T类型 如果T类接口类型,则该断言x实现了T接口 实例1 func ma ...
- golang MySQL 占内存_使用golang插入mysql性能提升經驗
前言 golang可以輕易制造高並發,在某些場景很合適,比如爬蟲的時候可以爬的更加高效.但是對應某些場景,如文件讀寫,數據庫訪問等IO為瓶頸的場合,就沒有什么優勢了. 前提基礎 1.golang數據庫 ...
- golang 键值对_对Golang地图的一些见解
golang 键值对 文章是关于地图的内部结构,哈希值和性能的. 数据实际上是如何存储在内部的. 基础概述 地图(又名关联数组)基本上是具有真正快速查找的键值存储. 真正的基本例子: m :=make ...
- golang java耗内存_分析golang内存占用情况
性能优化是个永恒的话题,而很多时候我们在作性能优化的时候,往往基于代码上面的直觉,把所有能想到的优化都优化了一遍,不错过任何小的优化点,结果整个代码的逻辑变得极其复杂,而性能上面并没有太大的提升.事实 ...
- golang mysql数据同步_使用Golang实现MySQL数据库之间的表同步
这是用来实现两个 MySQL 数据库中的具有相同字段表的增量同步. 支持按照某种格式增量获取表中的待同步数据. 支持按照列名称向 数据库 的表中批量插入待同步的数据. 安装 go get -u git ...
最新文章
- 对比学习(Contrastive Learning)综述
- Nginx HTTPS功能部署实践
- 基于LSTM电商评论情感分析-多评价指标可视化版(内附源码)【自然语言处理NLP-100例】
- C# 操作 Word 修改word的高级属性中的自定义属性
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第25篇]使用特殊的素数定义GF(p)和GF(2^n)的方法
- 鸿蒙系统华为什么手机你能用,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可
!【手机吧】_百度贴吧...
- Spring Cloud Alibaba 深度解密!
- 云消防大数据_消防云大数据app
- flashSlider——基于Jquery的图片展示插件
- shell脚本循环执行一个linux命令,Linux中循环执行shell命令的方法
- c语言输入的成绩由高到低该怎么,c语言编程:输入学生信息(姓名年龄分数)并按照分数由高到低输出...
- 给我的两个小站点带点外链
- Ionic 如何使用 Cordova 插件
- 计算机 程序安装管理,电脑安装软件时提示:系统管理员设置了系统策略,禁止进行此安装...
- 在线工具网,程序员必备小网址
- PDF文件实现在线盖章
- c语言 常量整数,C语言的整型常量
- 用计算机MR,常用计算器上的M+,M-,MC,MR都是什么意思,该怎么用?
- 怎么制作gif动态图 QQ动态表情包怎么制作
- 输入法规则(U模式输入)