当前位置: 首页 > 面试题库 >

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

谭桐
2023-03-14
问题内容

我有以下代码:

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不是表达式,必须调用

我在这里做错了什么?如何设置WriteFMyWriteFunction

注意:我尽了最大的努力简化了这个问题,实际上我有一个具有MyWriteFunctionAND普通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"))
}

我希望它能澄清我在第一次尝试中要表达的意思。

有什么想法吗?


问题答案:

您的代码中有错别字,但是无论如何都不需要将函数包装到结构中。相反,您可以只定义一个包装函数的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"))
}


 类似资料:
  • 问题内容: 我有以下功能: 其中,的类型是具有以下定义的接口: 题: 这是真的,和是 通过按引用 ,并且有它的价值被复制? 我认为: 是通过引用的,因为它是一张地图 是一个结构。因此,我应该传递指针以避免复制数据 问题答案: 接口类型只是一组方法。请注意,接口定义的成员未指定接收方类型是否为指针。这是因为 值类型的方法集是其关联的指针类型的方法集的子集 。满嘴 我的意思是,如果您具有以下条件: 然

  • Go 语言中指向结构体的指针和 C 语言一样 结构体和指针 创建结构体指针变量有两种方式 package main import "fmt" type Student struct { name string age int } func main() { // 创建时利用取地址符号获取结构体变量地址 var p1 = &Student{"lnj", 33}

  • 问题内容: 好的,我有一个主包和一个http处理程序包。本质上,我想做的是设置一个全局结构,以便我可以随时调用该结构中的信息。 下面是我尝试的示例的基本概述:主程序包导入处理程序函数主程序包调用handlerfunc Handlerfunc将http.ResponseWriter和其他项设置为UrlInfo结构Handlerfunc在函数中传递(不必将UrlStruct传递到函数中)Run函数(在

  • 第三方DLL有一个函数,该函数需要一个指向结构的指针作为参数: 它将手指指纹(通常为4个)的“拍打”图像分割成单独的指纹(手指的文件名)。 SrapInfo的定义是: C中的示例片段: 根据JNA常见问题解答,在我的情况下,我应该使用“结构”: 所以,我用Java/JNA做了这样的映射: 但是使用这种方法,我得到了错误: 我还尝试了: < li >指针引用而不是SlapInfo。ByReferen

  • 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个 指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是 函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType

  • 我正在学习链表,以及如何在C中使用结构和指针创建链表。下面我举一个例子。据我所知,被调用的将头节点所在的结构的开始内存位置作为参数传递。push()函数的参数将结构节点作为指向指针的指针,因此它作为引用传递,而不是实际副本。因此,我们的的第一个指针只是指向头部节点的内存位置的指针,第二个指针指向该值,该值是头部节点指向的下一个内存位置。我们通过为结构节点分配一些内存,在结构节点内创建一个名为new