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

Posted

技术标签:

【中文标题】Golang 函数指针作为结构的一部分【英文标题】:Golang function pointer as a part of a struct 【发布时间】:2014-01-10 19:28:49 【问题描述】:

我有以下代码:

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 函数,所以它有点复杂......(另外,如果有更好的方法解决我的这个问题,我会很高兴听到它!)

谢谢!!


编辑:我注意到我的错字并修正了它 (MyWriterFunction --> MyWriteFunction)。

我认为我过度简化了问题,误导了您的初衷。在匿名评论和 peterSO kind cmets 之后,我重新创建了错误以更好地展示我的问题:

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

我希望它澄清了我在第一次尝试时的意思。

有什么想法吗?

【问题讨论】:

你使用的是什么版本的 go?方法作为值直到 1.1 才出现。这段代码在操场上运行良好......play.golang.org/p/AmRi_fujPw 【参考方案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)

【讨论】:

嘿,感谢您的友好回答,它确实解决了提出的问题,但我现在已经解决了我的问题以更好地描述问题,感谢您的友好回答。

以上是关于Golang 函数指针作为结构的一部分的主要内容,如果未能解决你的问题,请参考以下文章

golang学习五·五:指针&切片&字典&结构体

golang学习五·五:指针&切片&字典&结构体

Golang 指针和结构体

Golang 空指针nil的方法和数据成员

Golang中的构造函数

Go语言学习之旅--结构体