去切片由C数组支持

时间:2018-02-15 17:25:06

标签: go cgo

在Golang Wiki的CGO部分,有一个article解释了如何创建由C数组支持的Go切片。在文章中有一个代码剪切,详细说明了转换,该片段中最重要的声明如下:

slice := (*[1 << 30]C.YourType)(unsafe.Pointer(theCArray))[:length:length]
除了[1 << 30]部分之外,声明中的所有内容对我都有意义。你能解释一下为什么需要这个吗?

1 个答案:

答案 0 :(得分:1)

数组大小1 << 30必须大于或等于length变量的任何值。

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    type YourType byte
    theCArray := &[8]YourType{}
    const arrayLen = 1 << 30

    {
        length := arrayLen

        fmt.Println()
        fmt.Println(arrayLen, length)
        fmt.Println()
        slice := (*[arrayLen]YourType)(unsafe.Pointer(theCArray))[:length:length]
        fmt.Println(len(slice), cap(slice), slice[:8])
    }

    {
        length := arrayLen + 1

        fmt.Println()
        fmt.Println(arrayLen, length)
        fmt.Println()
        // runtime error: slice bounds out of range
        slice := (*[arrayLen]YourType)(unsafe.Pointer(theCArray))[:length:length]
        fmt.Println(len(slice), cap(slice), slice[:8])
    }
}

游乐场:https://play.golang.org/p/e4jv8jfU_WI

输出:

1073741824 1073741824

1073741824 1073741824 [0 0 0 0 0 0 0 0]

1073741824 1073741825

panic: runtime error: slice bounds out of range

goroutine 1 [running]:
main.main()
    /tmp/sandbox576164402/main.go:30 +0x320