首页 > 解决方案 > 接口返回运行时错误:无效的内存地址或 nil 指针取消引用

问题描述

我已经用 Go 创建了一些代码并尝试实现一个接口。

有一个接口

type CityInterface interface {
    GetAll() (models.CityResponses, error)
}

然后在同一个接口文件包的单独文件上引用这个函数

//GetAll is a function to get all city
func GetAll() (models.CityResponses, error) {
    ....

    return cities, err
}

然后我使用该接口通过包服务为文件提供服务

func GetAllCity() (models.CityResponses, error) {
    var cityInterface repositories.CityInterface
    cities, err := cityInterface.GetAll()

    return cities, err
}

为什么此脚本返回紧急运行时错误:无效的内存地址或 nil 指针取消引用?

它指的是这条线

cities, err := cityInterface.GetAll()

请帮我找出这个问题。谢谢你。

标签: go

解决方案


var cityInterface repositories.CityInterface

此行声明一个类型变量repositories.CityInterface并分配零值。所有接口类型的零值为零。

在 nil 接口上调用方法会导致您观察到的恐慌(如果接口值中没有存储具体类型,运行时还能做什么?)。

看起来您正在尝试使用包级功能实现接口GetAll。这不是它的工作原理。接口是由类型实现的,而不是

使用方法来实现CityInterface定义类型,而不仅仅是名为的函数,并使用该类型的值初始化接口。GetAll GetAll

type T struct {}

func (T) GetAll() (models.CityResponses, error) {
    // Body of original GetAll function goes here.
}

func GetAllCity() (models.CityResponses, error) {
    var cityInterface repositories.CityInterface = T{} // initialize interface value
    cities, err := cityInterface.GetAll()

    return cities, err
}

或者,摆脱界面和GetAllCity; 这只是GetAll直接调用原始函数的一种复杂方式。


推荐阅读