Указатель функции Голанга как часть структуры
У меня есть следующий код:
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 и нормальная функция Write, поэтому она немного усложняется... (также, если есть лучший способ решить эту проблему моего то Ill рада это услышать!)
Благодарю!!
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"))
}
Надеюсь, он разъяснит, что я хотел представить с первой попытки.
Есть предположения?
Ответы
Ответ 1
В вашем коде есть опечатка, но в любом случае обертка 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"))
}
Ответ 2
Исправить 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)
}