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
相关产品推荐
相关产品推荐

