2 回答
TA贡献1810条经验 获得超5个赞
当一个类型被嵌入(在你的例子中LocalInterface被嵌入在里面LocalStruct)时,Go 会创建一个嵌入类型的字段并将其方法提升为封闭类型。
所以下面的声明
type LocalStruct struct {
LocalInterface
myOwnField string
}
相当于
type LocalStruct struct {
LocalInterface LocalInterface
myOwnField string
}
func (ls *LocalStruct) SomeMethod(s string) error {
return ls.LocalInterface.SomeMethod(s)
}
您的程序因 nil 指针取消引用而恐慌,因为LocalInterfacefield 是nil.
以下程序“修复”了恐慌(http://play.golang.org/p/Oc3Mfn6LaL):
package main
type LocalInterface interface {
SomeMethod(string) error
}
type LocalStruct struct {
LocalInterface
myOwnField string
}
type A int
func (a A) SomeMethod(s string) error {
println(s)
return nil
}
func main() {
var localInterface LocalInterface = &LocalStruct{
LocalInterface: A(10),
myOwnField: "test",
}
localInterface.SomeMethod("calling some method")
}
TA贡献1891条经验 获得超3个赞
经过进一步调查,我发现避免嵌入得到了适当的错误处理处理。在我的情况下,这将是首选:
package main
type LocalInterface interface {
SomeMethod(string) error
SomeOtherMethod(string) error
}
type LocalStruct struct {
myOwnField string
}
func main() {
var localInterface LocalInterface = &LocalStruct{myOwnField:"test"}
localInterface.SomeMethod("calling some method")
}
结果是:
.\main.go:13:不能在赋值中使用 LocalStruct 文字(类型 *LocalStruct)作为 LocalInterface 类型:*LocalStruct 没有实现 LocalInterface(缺少 SomeMethod 方法)
- 2 回答
- 0 关注
- 225 浏览
添加回答
举报