我对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)
}
答案 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。