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 变量时,它的范围是 -2147483648
到 2147483647
。也许你的变量超出了这个范围[:824633720845]
。在这种情况下,您应该使用 int64!
【讨论】:
我的意思是我知道 int32 的范围。我想知道"\"Hello World\""
字符串如何以及为什么超出该范围,而"Hello World"
甚至更长的字符串(如"the brown fox jumps over the lazy dog"
)却没有。以上是关于Golang SWIG 示例 2:切片边界超出范围恐慌的主要内容,如果未能解决你的问题,请参考以下文章