Golang中Lorca出现无效内存地址或空指针解引用问题

Golang中Lorca出现无效内存地址或空指针解引用问题 你好 我需要帮助,拜托了 我只是复制粘贴了一个使用 Golang 与 Chrome GUI 交互的方法,并使用了 Lorca 库。

那么为什么

func getUserName() string {
    var envKey string
    if runtime.GOOS == "windows" {
        envKey = "USERNAME"
    } else {
        envKey = "USER"
    }
    return os.Getenv(envKey)
}
func main() {
    ui, err := lorca.New("", "", 600, 400)

    ui.Bind("getUserName", getUserName) <------------------------
    ...,
}

会抛出这个错误? panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x0 addr=0x18 pc=0xcddbeb]

goroutine 1 [running]: main.main() C:/uga/golang-repo/main.go:27 +0x6b

我该如何传递这个函数才能让它正常工作?

提前感谢 此致


更多关于Golang中Lorca出现无效内存地址或空指针解引用问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

听起来你的UI对象是nil,请检查为什么lorca无法正确初始化。

更多关于Golang中Lorca出现无效内存地址或空指针解引用问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个错误是因为在调用 ui.Bind() 时,ui 变量为 nillorca.New() 返回错误时,ui 会是 nil,但你没有检查错误。

以下是修复后的代码:

func main() {
    ui, err := lorca.New("", "", 600, 400)
    if err != nil {
        log.Fatal(err)
    }
    defer ui.Close()

    // 现在 ui 不会是 nil,可以安全地调用 Bind
    ui.Bind("getUserName", getUserName)
    
    // ... 其他代码
}

错误处理是关键。当 lorca.New() 失败时(例如 Chrome 未安装或路径问题),它会返回非 nil 的错误,而 ui 会是 nil。尝试在 nil 指针上调用 Bind() 方法导致了空指针解引用错误。

另外,确保你的 getUserName 函数在 main 包中是可访问的,并且函数签名正确。你提供的函数应该可以正常工作。

完整示例:

package main

import (
    "log"
    "os"
    "runtime"

    "github.com/zserge/lorca"
)

func getUserName() string {
    var envKey string
    if runtime.GOOS == "windows" {
        envKey = "USERNAME"
    } else {
        envKey = "USER"
    }
    return os.Getenv(envKey)
}

func main() {
    ui, err := lorca.New("", "", 600, 400)
    if err != nil {
        log.Fatal(err)
    }
    defer ui.Close()

    ui.Bind("getUserName", getUserName)
    
    // 加载你的 HTML 或执行其他操作
    ui.Load("data:text/html," + `<html><body>
        <button onclick="alert(getUserName())">Get User</button>
    </body></html>`)

    <-ui.Done()
}

这样修改后,如果 lorca.New() 失败,程序会先打印错误信息并退出,而不是在 nil 指针上调用方法。

回到顶部