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

时间:2019-02-27 17:48:25

标签: go

我对Go还是比较陌生,我决定尝试一些OpenGL,因为存在一个可以为此提供绑定的Go库。作为设置OpenGL的一部分,我需要使用Go glfw library。我需要使用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)
}

1 个答案:

答案 0 :(得分:3)

https://github.com/go-gl/glfw/blob/2484f3e51bc432ea9f7daa182e418d5522201176/v3.2/glfw/window.go

type FramebufferSizeCallback func(w *Window, width int, height int)

vs

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

您的函数没有相同的签名,它使用的是int32而不是int。