如何使用 golang 库中的回调函数?

我对 Go 还是比较陌生,我决定尝试一些 OpenGL,因为存在一个为此提供绑定的 Go 库。作为设置 OpenGL 的一部分,我需要使用 Go glfw 库。我需要使用 glfw 库函数SetFramebufferSizeCallback ,它需要一个FrameBuffersizeCallback类型的参数;所以我基本上需要传递一个与我相信我已经完成的类型的签名相匹配的函数。但是,我不断收到以下错误:

./main.go:43:35: 不能在 window.SetFramebufferSizeCallback 的参数中使用 fbCallback(类型 func(*glfw.Window,int32,int32))作为类型 glfw.FramebufferSizeCallback

我真的不确定为什么会这样。我检查过我的 glfw 版本是否与文档匹配;我已经检查了 github 和我的机器上的实现代码,它们都是一致的。所以我不知道我做错了什么。这是我的代码,如果构建它应该不会做任何有趣的事情,但会显示错误:

package main


import (

    "github.com/go-gl/gl/v3.3-core/gl"

    "github.com/go-gl/glfw/v3.2/glfw"

    "log"

    "runtime"

)


func fbCallback(window *glfw.Window, width int32, height int32) {

    gl.Viewport(0, 0, width, height)

}


func init() {

    runtime.LockOSThread()

}


func main() {

    err := glfw.Init()

    if err != nil {

        panic(err)

    }


    defer glfw.Terminate()


    glfw.WindowHint(glfw.ContextVersionMajor, 3)

    glfw.WindowHint(glfw.ContextVersionMinor, 3)

    glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)


    window, err := glfw.CreateWindow(640, 480, "Testing", nil, nil)


    if err != nil {

        panic(err)

    }


    window.MakeContextCurrent()


    if err := gl.Init(); err != nil {

        log.Fatalln(err)

    }


    gl.Viewport(0, 0, 800, 600)

    window.SetFramebufferSizeCallback(fbCallback) //Does not work

}

我对这应该如何真正工作的理解在以下有效的简短程序中得到了证明。我很高兴有人指出为什么这个简短的示例有效而上面的示例无效。我的理解可能有一些漏洞。


package main


import (

    "fmt"

)


type callback func(int, int) int


func sum(x int, y int) int {

    return x + y

}


func useCallback(cb callback) {

    result := cb(2, 3)

    fmt.Println(result)

}


func main() {

    useCallback(sum)

}


杨魅力
浏览 106回答 1
1回答

慕侠2389804

type FramebufferSizeCallback func(w *Window, width int, height int)对比func fbCallback(window *glfw.Window, width int32, height int32)您的函数没有相同的签名,它使用的是 int32 而不是 int。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go