上个星期,我写了篇《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 中用名字调用函数相关推荐

  1. golang 函数传多个参数_关于Golang中方法参数的传递

    结构体声明 为了说明函数以及方法调用的过程,这里先定义一个struct,在下面的描述中会使用到它. type Person struct { Name string Age uint16 } 普通函数 ...

  2. python 函数调用 不允许关键字参数_你所不知道的Python|函数参数的演进之路

    原标题:你所不知道的Python|函数参数的演进之路 函数参数处理机制是Python中一个非常重要的知识点,随着Python的演进,参数处理机制的灵活性和丰富性也在不断增加,使得我们不仅可以写出简化的 ...

  3. python中什么是关键字参数_如何使用python语言中函数的关键字参数的用法

    一般情况下,在调用函数时,使用的是位置参数,即是按照参数的位置来传值:关键字参数是按照定义函数传入的参数名称来传值的.那么,关键字参数怎么使用? 工具/原料 python pycharm 截图工具 W ...

  4. python数据参数_零基础学习python数据分析——函数的参数

    原标题:零基础学习python数据分析--函数的参数 上一节课中我们讲了python的函数定义,Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数 ...

  5. golang 获取struct类型_聊聊golang的类型断言

    序 本文主要研究一下golang的类型断言 类型断言 x.(T) 断言x不为nil且x为T类型 如果T不是接口类型,则该断言x为T类型 如果T类接口类型,则该断言x实现了T接口 实例1 func ma ...

  6. golang MySQL 占内存_使用golang插入mysql性能提升經驗

    前言 golang可以輕易制造高並發,在某些場景很合適,比如爬蟲的時候可以爬的更加高效.但是對應某些場景,如文件讀寫,數據庫訪問等IO為瓶頸的場合,就沒有什么優勢了. 前提基礎 1.golang數據庫 ...

  7. golang 键值对_对Golang地图的一些见解

    golang 键值对 文章是关于地图的内部结构,哈希值和性能的. 数据实际上是如何存储在内部的. 基础概述 地图(又名关联数组)基本上是具有真正快速查找的键值存储. 真正的基本例子: m :=make ...

  8. golang java耗内存_分析golang内存占用情况

    性能优化是个永恒的话题,而很多时候我们在作性能优化的时候,往往基于代码上面的直觉,把所有能想到的优化都优化了一遍,不错过任何小的优化点,结果整个代码的逻辑变得极其复杂,而性能上面并没有太大的提升.事实 ...

  9. golang mysql数据同步_使用Golang实现MySQL数据库之间的表同步

    这是用来实现两个 MySQL 数据库中的具有相同字段表的增量同步. 支持按照某种格式增量获取表中的待同步数据. 支持按照列名称向 数据库 的表中批量插入待同步的数据. 安装 go get -u git ...

最新文章

  1. 对比学习(Contrastive Learning)综述
  2. Nginx HTTPS功能部署实践
  3. 基于LSTM电商评论情感分析-多评价指标可视化版(内附源码)【自然语言处理NLP-100例】
  4. C# 操作 Word 修改word的高级属性中的自定义属性
  5. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第25篇]使用特殊的素数定义GF(p)和GF(2^n)的方法
  6. 鸿蒙系统华为什么手机你能用,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  7. Spring Cloud Alibaba 深度解密!
  8. 云消防大数据_消防云大数据app
  9. flashSlider——基于Jquery的图片展示插件
  10. shell脚本循环执行一个linux命令,Linux中循环执行shell命令的方法
  11. c语言输入的成绩由高到低该怎么,c语言编程:输入学生信息(姓名年龄分数)并按照分数由高到低输出...
  12. 给我的两个小站点带点外链
  13. Ionic 如何使用 Cordova 插件
  14. 计算机 程序安装管理,电脑安装软件时提示:系统管理员设置了系统策略,禁止进行此安装...
  15. 在线工具网,程序员必备小网址
  16. PDF文件实现在线盖章
  17. c语言 常量整数,C语言的整型常量
  18. 用计算机MR,常用计算器上的M+,M-,MC,MR都是什么意思,该怎么用?
  19. 怎么制作gif动态图 QQ动态表情包怎么制作
  20. 输入法规则(U模式输入)

热门文章

  1. android 一些好的开源框架
  2. 【C语言】数据结构——树
  3. c#访问其他服务器的共享文件夹,C#如何访问共享文件夹或者磁盘
  4. 羊皮卷的故事-第十六章-羊皮卷之九
  5. 手机邮箱格式怎么写你知道吗?带你注册个人邮箱账号
  6. Vue2租车高德地图项目经验分享
  7. win10电脑服务器在哪个文件夹下,win10电脑桌面文件在c盘哪个文件夹里
  8. HXD3机车的主要参数
  9. 09 jQuery事件委托小米购物车
  10. 想一边上班一边做副业