Указатель функции 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 kind у меня есть повторно создал ошибку, чтобы лучше продемонстрировать мою проблему:

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: %vn", 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"))
}

надеюсь, это прояснит, что я хотел представить с первой попытки.

какие мысли?

2 ответов


в вашем коде есть опечатка, но обертывание func в структуру все равно не нужно. Вместо этого можно просто определить тип WriteFunc, который обертывает функцию и на котором можно определить метод записи. Вот полный пример.

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"))
}

исправить MyWriterFunction/MyWriteFunction опечатка. Например,

package main

import (
    "fmt"
    "io"
    "os"
)

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
}

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