相关疑难解决方法(0)

在Go中,变量何时变得无法访问?

Go 1.7 beta 1今天早上发布,这是Go 1.7的发行说明草案.KeepAlive包中添加了一个新功能runtime.该文件runtime.KeepAlive给出了一个例子:

type File struct { d int }
d, err := syscall.Open("/file/path", syscall.O_RDONLY, 0)
// ... do something if err != nil ...
p := &FILE{d}
runtime.SetFinalizer(p, func(p *File) { syscall.Close(p.d) })
var buf [10]byte
n, err := syscall.Read(p.d, buf[:])
// Ensure p is not finalized until Read returns.
runtime.KeepAlive(p)
// No more uses of p after this point.
Run Code Online (Sandbox Code Playgroud)

该文件runtime.SetFinalizer还给出了一个解释runtime.KeepAlive:

例如,如果p指向包含文件描述符d的结构,并且p具有关闭该文件描述符的终结器,并且如果函数中最后一次使用p是对syscall.Write的调用(pd,buf,size ),一旦程序进入syscall.Write,则p可能无法访问.终结器可能会在那一刻运行,关闭pd,导致syscall.Write失败,因为它正在写入一个已关闭的文件描述符(或者更糟糕的是,由一个不同的goroutine打开的完全不同的文件描述符).要避免此问题,请在调用syscall.Write之后调用runtime.KeepAlive(p).

令我感到困惑的是,变量 …

garbage-collection go

7
推荐指数
1
解决办法
651
查看次数

如何检查切片头?

这是从切片略微修改的代码

var buffer [256] byte

func SubtractOneFromLength(slice []byte) []byte {
    slice = slice[0 : len(slice)-1]
    return slice
}

func main() {
    slice := buffer[10:20]
    fmt.Println("Before: len(slice) =", len(slice))
    newSlice := SubtractOneFromLength(slice)
    fmt.Println("After:  len(slice) =", len(slice))
    fmt.Println("After:  len(newSlice) =", len(newSlice))
    newSlice2 := SubtractOneFromLength(newSlice)
    fmt.Println("After:  len(newSlice2) =", len(newSlice2))
}
Run Code Online (Sandbox Code Playgroud)

它表示slice参数的内容可以通过函数修改,但其标题不能.如何在屏幕上打印newSlice2的标题?

go slice

2
推荐指数
1
解决办法
295
查看次数

unsafe.Pointer到Go中的[]字节

我正在尝试为Go中的OpenGL项目编写一个截图函数,我正在使用此处的OpenGL绑定:

https://github.com/go-gl/glow

这是我用来制作屏幕截图的代码,或者说,这就是我正在做的事情:

    width, height := r.window.GetSize()
    pixels := make([]byte, 3*width*height)

    // Read the buffer into memory
    var buf unsafe.Pointer
    gl.PixelStorei(gl.UNPACK_ALIGNMENT, 1)
    gl.ReadPixels(0, 0, int32(width), int32(height), gl.RGB, gl.UNSIGNED_BYTE, buf)
    pixels = []byte(&buf) // <-- LINE 99
Run Code Online (Sandbox Code Playgroud)

这会在编译期间触发以下错误:

video\renderer.go:99: cannot convert &buf (type *unsafe.Pointer) to type []byte.
Run Code Online (Sandbox Code Playgroud)

如何转换unsafe.Pointer为字节数组?

arrays opengl pointers type-conversion go

0
推荐指数
1
解决办法
6292
查看次数