go - 接口返回运行时错误:无效的内存地址或 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()
请帮我找出这个问题。谢谢你。
解决方案
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
直接调用原始函数的一种复杂方式。
推荐阅读
- dafny - 如果我使用不同的 Boogie 后端来检查 Dafny 翻译的 bpl 文件,我能找到非虚假的反例吗?
- javascript - 下拉框主体上的手风琴框阴影
- r - 合并两个数据帧而忽略标题
- wordpress - Wordpress - 如何将动态内容分解为多个 div
- erlang - Ejabberd no etc , sbin 文件夹后 sudo make install
- php - session_start 的使用
- bash - 错误:无法打开显示:(空)无法在 Mac OS 上创建新的 xdo 实例
- python - Python 3 中 .keys() 的大多数 Pythonic 替换
- compression - 为什么 iOS 中的照片应用不存在无损裁剪?
- java - Facebook 登录 sdk - Android