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

Golang调用GetCategory触发nil指针空引用panic的预防与解决方法

错误根因

你遇到的panic是因为直接对nil的*string类型的color字段执行解引用操作*eventObj.color,Go语言不允许对空指针解引用,所以直接抛出运行时错误。

解决方案

以下是几种常用的优雅处理方式,可根据你的业务场景选择:


方案1:就地判空,设置默认值后调用

调用前先判断color是否为nil,非空直接解引用,为空则传入业务需要的默认值,适合调用次数少的场景:

func main() {
    category := "red"
    eventObj := event{
        Category: &category,
    }
    // 先判空再处理
    var colorParam string
    if eventObj.color != nil {
        colorParam = *eventObj.color
    } else {
        // 可自定义默认值,比如空字符串、"default"等
        colorParam = ""
    }
    res, err := GetCategory(colorParam)
    if err != nil {
        fmt.Println("获取分类失败:", err)
        return
    }
    fmt.Println(*res)
}

方案2:封装为结构体方法,内聚判空逻辑

如果多处需要从event实例获取分类,建议把逻辑封装为event的绑定方法,外部调用无需关心空指针处理:

import "errors" // 按需引入

func (e event) GetCategory() (*string, error) {
    // 内部统一处理color为nil的情况
    if e.color == nil {
        // 可按业务需求选择返回默认分类,或者返回错误
        defaultCat := "default"
        return &defaultCat, nil
        // 需要返回错误的话用下面这句:
        // return nil, errors.New("color字段为空")
    }
    colorVal := *e.color
    var category string
    if strings.HasPrefix(colorVal, "red") {
        category = "likes"
    } else if strings.HasPrefix(colorVal, "blue") {
        category = "dislikes"
    } else {
        category = "other"
    }
    return &category, nil
}

// 调用侧代码非常简洁
func main() {
    category := "red"
    eventObj := event{
        Category: &category,
    }
    res, err := eventObj.GetCategory()
    if err != nil {
        fmt.Println("获取分类失败:", err)
        return
    }
    fmt.Println(*res)
}

方案3:通用工具函数(Go 1.18+支持)

如果项目里有大量类似的指针判空解引用需求,可以写一个泛型工具函数复用逻辑:

// 泛型工具函数:指针非空返回解引用后的值,否则返回传入的默认值
func UnwrapOrDefault[T any](ptr *T, defaultValue T) T {
    if ptr != nil {
        return *ptr
    }
    return defaultValue
}

func main() {
    category := "red"
    eventObj := event{
        Category: &category,
    }
    // 一行完成判空+取值
    colorParam := UnwrapOrDefault(eventObj.color, "")
    res, err := GetCategory(colorParam)
    if err != nil {
        fmt.Println("获取分类失败:", err)
        return
    }
    fmt.Println(*res)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:03