【问题标题】:Go slice backed by a C array [duplicate]由C数组支持的切片[重复]
【发布时间】:2018-02-16 02:14:21
【问题描述】:

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

slice := (*[1 << 30]C.YourType)(unsafe.Pointer(theCArray))[:length:length]

除了[1 &lt;&lt; 30] 部分之外,声明中的所有内容对我来说都是有意义的。你能解释一下为什么需要这样做吗?

【问题讨论】:

    标签: go cgo


    【解决方案1】:

    数组大小1 &lt;&lt; 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
    

    【讨论】:

    • @JimB:从示例中可以看出,这是一个明显的拼写错误。固定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2012-02-20
    • 2010-09-29
    相关资源
    最近更新 更多