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

我有以下代码
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”接口的任何东西.

这个代码不会工作,因为它抱怨:

method MyWriterFunction is not an expression,must be called

我在这里做错了什么?如何将WriteF设置为MyWriteFunction?

注意:我尽可能简化了这个问题,实际上我有一个具有MyWriteFunction和一个正常写入函数的结构,所以它有点复杂…(如果有一个更好的方法解决我的这个问题那么我很高兴听到它!)

谢谢!!

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",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) {
    return wf(p)
}

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

func main() {
    io.Copy(WriteFunc(myWrite),strings.NewReader("Hello world"))
}

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...