gpt4 book ai didi

go - 为什么 Go 允许我调用未实现的方法?

转载 作者:IT王子 更新时间:2023-10-29 00:39:06 25 4
gpt4 key购买 nike

Go 似乎并没有强制遵循接口(interface)的结构。为什么下面的代码可以编译?

package main

type LocalInterface interface {
SomeMethod(string) error
SomeOtherMethod(string) error
}

type LocalStruct struct {
LocalInterface
myOwnField string
}

func main() {
var localInterface LocalInterface = &LocalStruct{myOwnField:"test"}

localInterface.SomeMethod("calling some method")
}

这似乎不应该编译,因为 SomeMethod 没有实现。go build 不会产生任何问题。

运行它会导致运行时错误:

> go run main.go
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x20 pc=0x4013b0]

goroutine 1 [running]:
panic(0x460760, 0xc08200a090)
C:/Go/src/runtime/panic.go:464 +0x3f4
main.(*LocalStruct).SomeMethod(0xc0820064e0, 0x47bf30, 0x13, 0x0, 0x0)
<autogenerated>:3 +0x70
main.main()
C:/Users/kdeenanauth/Documents/git/go/src/gitlab.com/kdeenanauth/structTest/main.go:16 +0x98
exit status 2

最佳答案

当嵌入类型时(在您的示例中,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)
}

因为 LocalInterface 字段为 nil,您的程序因 nil 指针取消引用而发生困惑。

以下程序“修复”了 panic (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")
}

关于go - 为什么 Go 允许我调用未实现的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36758900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com