go - 调用的语法 (object).function 是什么?它是如何在引擎盖下工作的?
问题描述
我偶然发现了一些有用的东西,但我不知道该怎么称呼它。我无法在博客或文档中看到任何使用它的示例(可能是因为我不知道谷歌的正确术语)。无论如何,这是一个代码片段,显示了我的意思。
client := &http.Client{}
clientGet := (*client).Get
// this works, and is calling the Get function on the client object. but how?
resp, err := clientGet(client, "http://google.com")
它几乎看起来像一个类型别名,但我不确定它吗?另外,这在引擎盖下是如何工作的?是否使用反射来调用 Get 函数,因此性能不如简单调用client.Get
?
解决方案
clientGet := (*client).Get
表达式产生一个方法值,正如评论中已经提到的,导致后续表达式无法clientGet(client, "http://google.com")
编译(参数太多)。
也许您打算使用clientGet := (*http.Client).Get
表达式,它被称为方法表达式,它产生一个函数:
... 可作为常规函数调用,其参数与 Get 相同,前缀为方法接收者的附加参数,即 *http.Client。
适合上下文的报价
然后使用该函数,后续表达式clientGet(client, "http://google.com")
编译不会出错。
你可以在这里看到编译器错误:https: //play.golang.org/p/KPmGinhMO-Y
推荐阅读
- android - 无法解析外部依赖项 com.android.tools.build:gradle:4.0.1,因为没有定义存储库
- python - 使 tkinter 网格交错
- python - 需要一些帮助将程序更改为面向对象的程序
- amazon-web-services - 什么是云形成 SSHLocation 语法?
- javascript - 如何标记此按钮以在我的车把文件中单击?
- python - 使用 Python 从电子邮件正文中删除某些文本
- python - 将 MSVC 编译器标志转换为 Clang 编译器标志
- flutter - Flutter:如何以编程方式在主屏幕中创建应用程序快捷方式?
- javascript - 请解释 move 方法在 Eloquent javascript 第 7 章中是如何工作的
- javascript - 当 sum 格式为负值和小数点分隔符时,jQuery 返回 NAN