接受具有空接口返回类型的参数中的函数

2024-01-08

我想了解为什么下面的代码片段无法编译。 Go 接受函数作为可能具有任何返回类型的函数参数的方式是什么?

package main

func main() {
    test(a) // Error: cannot use a (type func() string) as type func() interface {} in argument to test
    test(b) // Error: cannot use b (type func() int) as type func() interface {} in argument to test
}

func a() string {
    return "hello"
}

func b() int {
    return 1
}

func test(x func() interface{}) {

    // some code...
    v := x()
    // some more code....
}

Play: https://play.golang.org/p/CqbuEZGy12 https://play.golang.org/p/CqbuEZGy12

我的解决方案基于沃尔克的回答:

package main

import (
    "fmt"
)

func main() {

    // Wrap function a and b with an anonymous function
    // that has an empty interface return type. With this
    // anonymous function, the call signature of test
    // can be satisfied without needing to modify the return
    // type of function a and b.

    test(func() interface{} {
        return a()
    })

    test(func() interface{} {
        return b()
    })
}

func a() string {
     return "hello"
}

func b() int {
    return 1
}

func test(x func() interface{}) {
    v := x()
    fmt.Println(v)  
}

Play: https://play.golang.org/p/waOGBZZwN7 https://play.golang.org/p/waOGBZZwN7


对于 Go 新手来说,你犯了一个非常常见的误解:空接口interface{} does not意思是“任何类型”。确实,事实并非如此。 Go 是静态类型的。空接口interface {}是一个实际的(强类型类型),例如string or struct{Foo int} or interface{Explode() bool}.

这意味着如果某物具有以下类型interface{}它具有该类型而不是“任何类型”。

你的职能

func test(x func() interface{})

采用一个参数。这个参数是一个(无参数函数),它返回一个特定的类型,该类型interface{}。您可以将任何函数传递给test与此签名匹配:“无参数并返回interface{}“。没有你的功能a and b匹配这个签名。

正如上面所说:interface {}不是“whatever”的神奇缩写,它是一种独特的静态类型。

你必须改变,例如至:

func a() interface{} {
    return "hello"
}

现在,当您返回一个时,这可能看起来很奇怪string这不是类型interface{}。这是有效的,因为任何类型都可以分配给类型的变量interface{}(因为每种类型至少没有方法:-)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

接受具有空接口返回类型的参数中的函数 的相关文章

  • 在 Go 中使用 init() 函数真的很糟糕吗?

    几天前我开始了一个新的 go 项目 我使用 golangci lint 使我的代码具有良好的风格 我发现 gochecknoinits 是 golangci lint 的 linter 之一 它告诉我不要使用 init 在我看来 为了方便起
  • 为什么结构体不能转换为嵌入类型

    package main type Inner struct x int type Outer struct Inner func main x Inner 1 y Outer x cannot convert x type Inner t
  • 在 Go 中修改导入的库

    我的问题 弹性节拍 https www elastic co products beats是一个用 Go 编写的日志传送程序的开源项目 它具有多种日志输出功能 包括控制台 Elasticsearch 和 Redis 我想将我自己的输出添加到
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • Go 中数组的嵌套结构

    我已经开始使用https mholt github io json to go https mholt github io json to go 将 API JSON 转换为 go 结构 我真的很喜欢它 但是我对如何初始化如下所示的报告定义
  • 如何通过模板中的变量访问对象字段?

    我有一个嵌套循环 columns columns range dx dataList range c columns index dx c end end dataList是orm模型数组 和ID Title字段 那么columns is
  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • Google Cloud Kubernetes 上任务队列的替代方案

    我发现任务队列主要用于App Engine标准环境 我正在将现有服务从 App Engine 迁移到 Kubernetes 任务队列的一个好的替代方案是什么 推送队列是当前正在使用的队列 我在线阅读文档并浏览了此链接 何时使用 PubSub
  • ReverseProxy取决于golang中的request.Body

    我想构建一个 http 反向代理 它检查 HTTP 主体 然后将 HTTP 请求发送到它的上游服务器 你怎么能在 Go 中做到这一点 初始尝试 如下 失败 因为 ReverseProxy 复制传入请求 修改它并发送 但正文已被读取 func
  • 使用cgo时的多重定义

    package main int add int a int b return a b import C import fmt func main func Test1 fmt Println C add 1 3 export Test2
  • 从 []byte 到 char*

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c
  • Go io.Pipe 的缓冲版本

    有缓冲版本吗io Pipe https golang org pkg io Pipe 在标准库或第三方库中 在我推出自己的库之前 上下文 我正在尝试使用这个解决方案 https stackoverflow com a 36229262 15
  • 是否可以获取有关 Golang 中调用者函数的信息?

    是否可以获取有关 Golang 中调用者函数的信息 例如 如果我有 func foo Do something func main foo 我怎样才能得到那个foo已被呼叫来自main 我可以用其他语言实现这一点 例如在 C 中我只需要使用
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • Golang:带有 JSON 负载的 http.NewRequest POST 返回错误 500

    我正在开发一个 API 库 有一个API端点 POST 当您发出curl命令时 它是 curl H X API TOKEN API TOKEN http interest graph getprismatic com text topic
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 如何同时使用 LoadHTMLGlob 和 LoadHTMLFiles

    我想要来自不同子目录的分隔符逻辑模板templates文件夹 下面是我的templates文件夹 templates authentication login gohtml logout gohtml index gohtml profil

随机推荐

  • AngularJS $Broadcast 和 $on 不更新 $scope

    我正在尝试使用用户的姓名更新主导航栏 并使用他购买的商品数量更新购物车图标 我以前没有尝试过使用 broadcast 和 on 成功登录后 我设置了一个简单的广播 这是在其自己的登录控制器中 rootScope broadcast user
  • NLog 未写入数据库表

    这是我的 NLog 配置文件
  • 当 Azure Active Directory 中的 AuthenticationMode 为 Passive 时如何获取/设置用户身份

    我已将 AuthenticationMode 设置为被动 并使用显式质询重定向到天蓝色登录页面 这很有效 但我需要一种编程方式来查明用户是否经过身份验证 我还想利用用户名 但它在 HttpContext User Identity IsAu
  • 关于 UTYPE 的了解!在《REBOL 3》中?

    我能找到的关于数据类型 UTYPE 的唯一信息 尚未针对 R3 进行记录 和 用户定义的数据类型 但仍然给我带来一丝希望 即我可以突破 Rebol 的预定义数据类型规范 并以更直接的方式制定函数的多态性 只是 我不知道如何处理UTYPE 试
  • CSS 展开/收缩动画以显示/隐藏内容

    我正在尝试创建一个可以通过简单的滑出动画展开和折叠的盒子 如果运行下面的示例 其想法是 它以一条红线开始 当您单击按钮时 它会分成两条读取线 并轻轻展开以显示内容 就像从表格中拉出一幅画一样 我已经尝试过变换 动画 相对 与顶部定位 但无法
  • 如何使用 serverless.yml 创建 dynamodb 表并使用 python boto3 删除其中的项目?

    我使用 serverless yml 创建了 dynamodb 表 如下所示 resources Resources myTable Type AWS DynamoDB Table DeletionPolicy Retain Propert
  • 计算每日平均值(或者:某个日期范围内有多少个星期一?)

    我的 MySQL 表具有以下列 datetime price paid 我正在尝试计算两个日期之间一周中每天的平均销售额 这意味着我需要选择日期 startDate 和 endDate 之间的销售额总和 按工作日分组 然后除以该范围内每个工
  • CUDA 中的 FIR 滤波器(作为一维卷积)

    我正在尝试在 CUDA 中实现 FIR 有限脉冲响应 滤波器 我的方法非常简单 看起来有点像这样 include
  • 使用适用于 iOS 的 SDK 在 Linkedin 上分享不起作用

    我正在使用 iOS 版移动 SDK 版本 1 0 7 来分享一些内容LinkedIn 我可以获取当前帐户信息 但是当我尝试分享时LinkedIn 总是反馈错误描述 这是我的代码 let url String https api linked
  • 使用 FXMLLoader 时出现 IllegalAccessError

    我正在尝试将 FXML 文件加载到我的 javafx 应用程序中作为我的根小部件 我使用带有 java 11 04 的 Windows 8 1 和带有 Eclipse 2019 IDE 的 javafx sdk 13 我在互联网上搜索了一下
  • 增加 d3 SVG 容器大小

    我正在尝试动态增加 SVG 容器的大小 以便它适合所有数据 有一个小提琴解释了 SVG 的动态增加 http jsfiddle net CKW5q http jsfiddle net CKW5q 然而 相同的概念不适用于双向桑基图 d3 以
  • 如何旋转图像并保存图像

    在我的应用程序中 我的 div 中有一个图像 一个按钮 当我使用 jquery 单击按钮时 我想旋转显示的图像并保存旋转的图像 我已经使用了代码 http code google com p jquery rotate http code
  • 如何通过打字稿代码动态注入 Angular2 子组件?

    上下文 我正在尝试创建一个可以包含多个组件的自定义下拉列表 我可以通过以下方式完成此任务
  • 入门:为 Node.js 设置数据库

    我是 Node js 的新手 但很高兴尝试一下 我在用Express http expressjs com 作为网络框架 以及Jade http jade lang com作为模板引擎 两者都很容易完成以下设置本教程 http www us
  • 从实现类中的接口继承注释?

    假设我有这个界面 public interface IFoo
  • 如何根据设备大小操作 iframe css

    我正在构建此网站 但在根据设备大小操作 iframe 时遇到问题 基本上 我想要的是 如果在平板电脑上使用 则视频是一种尺寸 但例如 如果用户使用手机等移动设备 则视频是其他尺寸 建议它小于平板电脑或桌面窗口尺寸 如果有任何一个从那以后 我
  • JSP scriptlet 中的方法合法吗?

    我知道不推荐它 我应该使用标签库等 但我仍然想知道在 JSP scriplet 中声明方法是否合法 那合法吗 我收到一些奇怪的编译错误 例如a is expected 这似乎不合适 谢谢 您需要使用声明语法
  • Google USB 包未显示在 SDK 管理器中

    我最近下载并安装了 Eclipse Java EE IDE Indigo Service Release 2 我制作了一个在模拟器上运行良好的简单应用程序 现在我想尝试在我的 Android 移动设备上运行它 在 Android 开发者网站
  • 允许后台应用程序设置不同进程的前台窗口

    首先 我知道这是一个有争议的讨论 但我希望我们能够保持技术性 我有一个在后台启动的应用程序 我希望它能够在不同的进程中激活 聚焦窗口 但是 即使我要激活其窗口的进程已调用AllowSetForegroundWindow ASFW ANY 调
  • 接受具有空接口返回类型的参数中的函数

    我想了解为什么下面的代码片段无法编译 Go 接受函数作为可能具有任何返回类型的函数参数的方式是什么 package main func main test a Error cannot use a type func string as t