Golang SWIG 示例 2:切片边界超出范围恐慌

Posted

技术标签:

【中文标题】Golang SWIG 示例 2:切片边界超出范围恐慌【英文标题】:Golang SWIG Example 2: slice bounds out of range panic 【发布时间】:2020-06-09 09:04:44 【问题描述】:

我目前正在通过SWIG Go examples 自己工作,我在第二个示例“constants”上遇到问题

由于某种原因,我让切片边界超出范围恐慌,但前提是我在 swig 调用中将 32 指定为 -intgosize 参数的参数。

如果我使用 swig -go -intgosize 64 example.i 运行 swig 一切正常

example.i swig 文件如下所示

/* File : example.i */
%module example

/* A few preprocessor macros */

#define    ICONST      42
#define    FCONST      2.1828
#define    CCONST      'x'
#define    CCONST2     '\n'
#define    SCONST      "Hello World"
#define    SCONST2     "\"Hello World\""

/* This should work just fine */
#define    EXPR        ICONST + 3*(FCONST)

/* This shouldn't do anything */
#define    EXTERN      extern

/* Neither should this (BAR isn't defined) */
#define    FOO         (ICONST + BAR)

/* The following directives also produce constants */

%constant int iconst = 37;
%constant double fconst = 3.14;

从我在使用 32 参数运行 swig 时得到的输出来看,我认为恐慌是由 SCONST2 引起的,在注释掉 #define SCONST2 行之后,恐慌就消失了。

SCONST2 的输出如下所示:

panic: runtime error: slice bounds out of range [:824633720845] with length 2147483647

goroutine 1 [running]:
swigtest/02_constants.swigCopyString(0x1056760, 0xc00000000d, 0xc000107ef0, 0xc000107ef8)
        C:/Users/visfgp/go/personal_code/src/swigtest/02_constants/example.go:64 +0xb0
swigtest/02_constants._swig_getSCONST2(0x50230a, 0xc00003e1e0)
        C:/Users/visfgp/go/personal_code/src/swigtest/02_constants/example.go:97 +0x4a
swigtest/02_constants.init()
        C:/Users/visfgp/go/personal_code/src/swigtest/02_constants/example.go:101 +0x38

我的问题是这个字符串特别引发了这种恐慌,为什么SCONST 字符串没有抛出它,它与 go int 的大小有什么关系?

【问题讨论】:

2147483647 是 int32 的 Mac 值。 824633720845 明显超过了。 【参考方案1】:

当您定义一个 int32 变量时,它的范围是 -21474836482147483647。也许你的变量超出了这个范围[:824633720845]。在这种情况下,您应该使用 int64!

【讨论】:

我的意思是我知道 int32 的范围。我想知道"\"Hello World\"" 字符串如何以及为什么超出该范围,而"Hello World" 甚至更长的字符串(如"the brown fox jumps over the lazy dog")却没有。

以上是关于Golang SWIG 示例 2:切片边界超出范围恐慌的主要内容,如果未能解决你的问题,请参考以下文章

golang 循环切片通过golang中的切片使用范围

当切片索引超出范围时如何引发 IndexError?

偶尔的“切片超出范围”恐慌

为啥索引超出范围的子字符串切片有效?

golang Golang并发切片示例

golang:将有序的数字切片转换为数字范围表示的字符串数组