Golang 函数指针作为结构的一部分

2024-04-14

我有以下代码:

type FWriter struct {
    WriteF func(p []byte) (n int,err error)
}

func (self *FWriter) Write(p []byte) (n int, err error) {
    return self.WriteF(p)
}

func MyWriteFunction(p []byte) (n int, err error) { 
    // this function implements the Writer interface but is not named "Write"
    fmt.Print("%v",p)
    return len(p),nil
}

MyFWriter := new(FWriter)
MyFWriter.WriteF = MyWriteFunction
// I want to use MyWriteFunction with io.Copy
io.Copy(MyFWriter,os.Stdin)

我想做的是创建一个 Writer 接口来包装MyWriteFunction因为它没有命名为“Write”,并且我无法将它与任何需要“Writer”接口的东西一起使用。

此代码将无法工作,因为它会抱怨:

方法 MyWriterFunction 不是表达式,必须调用

我在这里做错了什么?我该如何设置WriteF to be MyWriteFunction?

注意:我尽可能地简化了这个问题,实际上我有一个结构体,其中包含MyWriteFunction和一个普通的写入功能,所以它变得有点复杂......(另外,如果有更好的方法来解决我的这个问题,那么我会很高兴听到它!)

Thanks!!


EDIT:我注意到我的错字并修复了它(MyWriterFunction --> MyWriteFunction).

我认为我过于简化了问题,误导了您我的初衷。根据匿名评论和 peterSO 善意评论,我重新创建了错误以更好地演示我的问题:

package main

import (
    "fmt"
    "io"
    "strings"
)

type ProxyWrite interface {
    Write(p []byte) (n int, err error)
    SpecialWrite(p []byte) (n int, err error)
}

type Implementer struct {
    counter int
}

func (self Implementer) Write(p []byte) (n int, err error) {
    fmt.Print("Normal write: %v", p)
    return len(p),nil
}

func (self Implementer) SpecialWrite(p []byte) (n int, err error) {
    fmt.Print("Normal write: %v\n", p)
    fmt.Println("And something else")
    self.counter += 1
    return len(p),nil
}


type WriteFunc func(p []byte) (n int, err error)

func (wf WriteFunc) Write(p []byte) (n int, err error) {
    return wf(p)
}

func main() {
    Proxies := make(map[int]ProxyWrite,2)
    Proxies[1] = new(Implementer)
    Proxies[2] = new(Implementer)

    /* runs and uses the Write method normally */
    io.Copy(Proxies[1], strings.NewReader("Hello world"))
    /* gets ./main.go:45: method Proxies[1].SpecialWrite is not an expression, must be called */
    io.Copy(WriteFunc(Proxies[1].SpecialWrite), strings.NewReader("Hello world"))
}

我希望它能澄清我第一次尝试时想要表达的意思。

有什么想法吗?


您的代码中有一个拼写错误,但无论如何都不需要将 func 包装到结构中。相反,您可以只定义一个包装函数的 WriteFunc 类型,并且可以在其上定义 Write 方法。这是一个完整的例子。

package main

import (
    "fmt"
    "io"
    "strings"
)

type WriteFunc func(p []byte) (n int, err error)

func (wf WriteFunc) Write(p []byte) (n int, err error) {
    return wf(p)
}

func myWrite(p []byte) (n int, err error) {
    fmt.Print("%v", p)
    return len(p), nil
}

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

Golang 函数指针作为结构的一部分 的相关文章

随机推荐

  • PostgreSQL:将结果与标题复制/粘贴到 Excel 中,无需代码

    我使用 MS SQL Server 2008 R2 MS SQL 我可以右键单击查询结果 将其与标题一起复制 粘贴到 Excel 中 以便于探索 现在使用 PG Admin PostgreSQL 我必须执行导出 文件 gt 导出 gt CS
  • 如何使用 .NET XML API 删除 xmlns 属性

    XmlElement Attributes Remove 方法对于任意属性都可以正常工作 导致已删除的属性从 XmlDocument OuterXml 属性中删除 然而 Xmlns 属性是不同的 这是一个例子 XmlDocument doc
  • “FOR UPDATE”v/s“LOCK IN SHARE MODE”:允许并发线程读取锁定行的更新“状态”值

    我有以下场景 用户 X 从位置 lc1 登录到应用程序 调用它Ulc1 用户 X 已被黑客攻击 或者他的某个朋友知道他的登录凭据 或者他只是从他计算机上的不同浏览器登录 等等 你明白了 从位置 lc2 同时登录 调用它Ulc2 我正在使用一
  • GraphQL 代码中的 Javascript 循环依赖

    我是 Javascript 新手 不知道如何解决这个问题 我正在创建一个 GraphQL 服务来提供对数据库的查询 我想定义三种类型 个人 公司和关系 type Relation person Person company Company
  • Java 如何向字符串添加重音符号“e”?

    在tucuxi现有职位的帮助下Java 不使用正则表达式从 String 中删除 HTML https stackoverflow com questions 2488967 java remove html from string wit
  • Java Lambda 表达式 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 Java 8 中添加了 Lambda 表达式 我想了解为什么这很重要 对于尚未接触过函数式编程习惯的 Java 程序员来说 这意味着什么 这是否意味着
  • Postgresql - 加密 jsonb 数据

    我的 postgres 表中有一个 jsonb 列 用于存储 json 数据 我想以加密格式存储数据并能够查询并获取纯文本值 有办法做到吗 Use the pgcrypto https www postgresql org docs cur
  • 处理序列中的每一对

    我正在寻找一种简洁的方法来处理 NET 中序列中的每对 无序 元素 我知道我可以用嵌套来做到这一点for循环 但我一直在寻找更具可读性的东西 我正在想象类似修改过的东西Any 扩展方法 IEnumerable
  • C# 在下一行之前等待或暂停 X 秒

    我想找出执行以下操作的最佳方法是什么 我有一个与 httpwebrequest 一起使用的控制台应用程序 在我的应用程序的某些部分我想这样做 agent GetURL http site com etc Wait for 8 16 Seco
  • 在 IOS 中单击时更改按钮文本颜色

    我知道这个问题经常被问到 并且许多答案都是正确的 我的代码中遇到了问题 我有单选按钮 当用户单击按钮时 背景颜色和文本颜色会发生变化 背景颜色按我的预期更改 但单击按钮时文本颜色变为蓝色区域 我已将其编码为在单击时更改白色 但是当我单击按钮
  • 将 Map key 反序列化为 POJO 引用

    Jackson 是否可以从给定 id 的相同 json 字符串中获取对先前反序列化对象的引用 例如 我有以下 Java 类 public class Company List
  • 将 iPhone 应用程序上传到 AppStore 的步骤

    我想知道将我的 iPhone 应用程序上传到 AppStore 的基本步骤 如何使用证书创建配置文件以及上传应用程序还需要执行哪些其他设置 我刚刚使用 Xcode 和 iPhone SDK V2 2 1 在 iMac 上制作了一个应用程序
  • 所有方法都返回“.autoNumeric 不是函数 - 无法取消数字格式”

    我试图获取使用 autoNumeric 格式化的输入数字的原始值 但不能 因为我尝试执行此操作的每种方法都会返回 autoNumeric 不是函数 在控制台中 document ready function new AutoNumeric
  • 使用Android GPS检测并与其他手机连接

    所以我昨天问了类似的问题 并且确实收到了我的问题的答案 但是我真的认为我问得不正确 因此没有收到我需要的确切信息 我正在寻找 API 一些开源代码 甚至只是其他人在 Android 上实现这一目标的方法 我正在制作一个应用程序 需要查找指定
  • 为什么Python中没有len(file)?

    我对 Python 并不陌生 但我仍然很难理解是什么让某些东西变得 Pythonic 反之亦然 如果这是一个愚蠢的问题 请原谅我 但是为什么我不能通过执行 len file 来获取文件的大小 file len 甚至没有实现 所以它不像其他东
  • 过度使用 If else 语句

    我有一个查询 那就是我使用了一种方法 但是我很多次使用了 If Else 不是它变得非常含糊 请建议我也可以使用其他条件循环吗 下面是我的代码 if cardType AARP CARD TYPE userResponse messageB
  • HBase:创建多个表或包含多个列的单个表?

    什么时候创建多个表而不是创建具有大量列的单个表才有意义 据我了解 表通常只有几个列族 1 2 每个列族可以支持 1000 多个列 当 HBase 似乎在单个表中可能存在大量列时表现良好时 什么时候创建单独的表才有意义 在回答问题本身之前 让
  • SQL查询求和

    我有两张桌子 Unit Unit id Unit name Unit cost 成分 Component id Component name Unit id 它们通过以下方式连接在一起Unit id Unit id 1有名字Unit 1 N
  • DurandalJS 路由行为

    我拥有的 试图了解发生了什么以及如何控制它 我对尚未经过身份验证的用户有一个 公共 视图 对经过身份验证的用户有一个 主页 视图 这是我的路线配置 app start then function Replace viewmodels in
  • Golang 函数指针作为结构的一部分

    我有以下代码 type FWriter struct WriteF func p byte n int err error func self FWriter Write p byte n int err error return self