猿问

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”接口的东西。


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


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


我在这里做错了什么?我怎样才能设置WriteF为MyWriteFunction?


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


白猪掌柜的
浏览 287回答 2
2回答

慕田峪4524236

您的代码中有一个错字,但无论如何都没有必要将 func 包装到结构中。相反,您可以只定义一个包装函数的 WriteFunc 类型,并且您可以在其上定义一个 Write 方法。这是一个完整的例子。package mainimport (    "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 mainimport (    "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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答