golang golang恐慌

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang golang恐慌相关的知识,希望对你有一定的参考价值。

defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()

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

【中文标题】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 golang恐慌的主要内容,如果未能解决你的问题,请参考以下文章

在 Golang 中捕捉恐慌

Golang 模拟上下文恐慌

在golang中输入正确但输出恐慌

golang 展示恐慌,推迟和恢复结合使用的完整例子

golang - mysql 恐慌:运行时错误:无效的内存地址或 nil 指针取消引用

golang http 恐慌的全局恢复处理程序