You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言程序运行出现exit status 2错误的原因排查求助

Go程序exit status 2错误排查

代码示例

package main

import (
    "C" // 注意这里的多余导入
    "fmt"
    "io"
    "net/http"
    "time"

    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/widget"
)

func Call2(someurl string) (*http.Response, error) {
    req, err := http.NewRequest(http.MethodGet, someurl, nil)
    if err != nil {
        fmt.Printf("Error creating request: %s", err)
        return nil, err
    }
    client := http.Client{
        Timeout: 30 * time.Second,
    }
    res, err := client.Do(req)
    if err != nil {
        fmt.Printf("Error making HTTP request: %s", err)
        return nil, err
    }
    return res, nil
}

func tidyUp() {
    fmt.Println("Exited")
}
func main() {
    myApp := app.New()
    myWindow := myApp.NewWindow("Hello")
    k, err := Call2("https://acre.iex.cloud/v1/data/CORE/REF_DATA?token=pk_79891f5cbcce4099ae063588956f937a")
    if err != nil {
        fmt.Printf("Error making HTTP request: %s", err)
        return
    }
    defer k.Body.Close()
    b, err := io.ReadAll(k.Body)
    if err != nil {
        fmt.Printf("Error reading response body: %s", err)
        return
    }
    //  fmt.Println(string(b))
    myWindow.SetContent(widget.NewLabel(string(b)))
    myWindow.Show()
    myApp.Run()
    tidyUp()
}

错误日志片段

开头部分

Exception 0xc0000005 0x0 0x7ffbd991a0f0 0x7ff89943445e
PC=0x7ff89943445e
signal arrived during external code execution

runtime.cgocall(0x7ff6ead942c0, 0xc000065da0)
        C:/Program Files/Go/src/runtime/cgocall.go:157 +0x3e fp=0xc000065d78 sp=0xc000065d40 pc=0x7ff6ea9655be
github.com/go-gl/glfw/v3.3/glfw._Cfunc_glfwMakeContextCurrent(0x2157624b2d0)

结尾部分

C:/Program Files/Go/src/runtime/asm_amd64.s:1650 +0x1 fp=0xc01494dfe8 sp=0xc01494dfe0 pc=0x7ff6ea9c8ac1
created by os/signal.Notify.func1.1 in goroutine 55
        C:/Program Files/Go/src/os/signal/signal.go:151 +0x1f
rax     0xfff0fff
rbx     0xd075dff3a0
rcx     0x7ffbd991a0cc
rdi     0x7ff899c26100
rsi     0x2157c392b20
rbp     0xd075dfefb0
rsp     0xd075dfeea8
r8      0xd075dfefc0
r9      0xd075dff3a0
r10     0xd075dff190
r11     0x0
r12     0x100
r13     0x0
r14     0x1
r15     0x0
rip     0x7ff89943445e
rflags  0x10206
cs      0x33
fs      0x53
gs      0x2b
exit status 2

错误原因及解决方法

1. 多余的CGO导入是核心问题

代码里导入了"C"但完全没有使用,这会强制Go启用CGO模式,而Fyne依赖的GLFW库在CGO模式下容易触发Windows平台的内存访问违例(Exception 0xc0000005就是典型的内存访问错误)。直接删掉import "C",重新运行程序即可解决大部分此类问题。

2. 优化GUI线程操作逻辑

Fyne的UI操作必须在主线程执行,当前代码先执行API请求再初始化UI,若请求耗时较长可能导致UI初始化时机异常。可以把API请求放到goroutine中,获取数据后再通过Fyne的主线程更新UI:

func main() {
    myApp := app.New()
    myWindow := myApp.NewWindow("Hello")
    label := widget.NewLabel("加载中...")
    myWindow.SetContent(label)
    myWindow.Show()

    go func() {
        k, err := Call2("https://acre.iex.cloud/v1/data/CORE/REF_DATA?token=pk_79891f5cbcce4099ae063588956f937a")
        if err != nil {
            fmt.Printf("Error making HTTP request: %s", err)
            return
        }
        defer k.Body.Close()
        b, err := io.ReadAll(k.Body)
        if err != nil {
            fmt.Printf("Error reading response body: %s", err)
            return
        }
        // 在主线程更新UI
        myApp.RunOnMain(func() {
            label.SetText(string(b))
        })
    }()

    myApp.Run()
    tidyUp()
}

3. 更新Fyne依赖并重新构建

若问题依然存在,可能是Fyne或其依赖的GLFW库版本兼容性问题,执行以下命令更新到最新版本:

go get fyne.io/fyne/v2@latest
go mod tidy

之后重新编译运行程序。

4. 使用Fyne官方打包工具构建

Windows下直接用go run可能跳过部分依赖库的处理,尝试用Fyne的打包工具生成可执行文件:

fyne package -os windows # 图标可选,可添加-icon参数指定图标文件

运行生成的exe文件即可。

内容的提问来源于stack exchange,提问作者Ethan Leonard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:58:15