use*_*495 16 interface function go writer
我有以下代码:
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)
Run Code Online (Sandbox Code Playgroud)
我想要做的是创建一个Writer接口来包装MyWriteFunction,因为它没有命名为"Write",我不能将它用于任何需要"Writer"接口的东西.
这段代码不会起作用,因为它抱怨:
method MyWriterFunction is not an expression, must be called
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?如何将WriteF设置为MyWriteFunction?
注意:我尽可能地简化了这个问题,实际上我有一个具有MyWriteFunction和一个普通Write函数的结构,所以它有点复杂......(如果有更好的方法来解决我的这个问题)那么我很高兴听到它!)
谢谢!!
编辑::我注意到我的拼写错误并修复了它(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"))
}
Run Code Online (Sandbox Code Playgroud)
我希望它澄清我在第一次尝试时要表达的意思.
有什么想法吗?
Pau*_*kin 18
您的代码中存在拼写错误,但无论如何都不需要将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"))
}
Run Code Online (Sandbox Code Playgroud)
修正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)
}
Run Code Online (Sandbox Code Playgroud)