gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:05:11 26 4
gpt4 key购买 nike

我有以下代码:

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 接口(interface)来包装 MyWriteFunction 因为它没有命名为“Write”,我不能将它与任何需要“Writer”接口(interface)的东西一起使用。

此代码无法正常工作,因为它提示:

method MyWriterFunction is not an expression, must be called

我在这里做错了什么?如何将 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"))
}

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

有什么想法吗?

最佳答案

您的代码中有一个错字,但无论如何都不需要将 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"))
}

关于function - Golang 函数指针作为结构的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20728965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com