Golang 等价于 Python 的 NotImplementedException
Posted
技术标签:
【中文标题】Golang 等价于 Python 的 NotImplementedException【英文标题】:Golang equivalent to Python's NotImplementedException 【发布时间】:2017-04-30 01:18:02 【问题描述】:当您使用您还不想实现的方法定义接口时,Golang 中是否有等效于在 Python 中引发 NotImplementedException
的方法?这是惯用的 Golang 吗?
例如:
type MyInterface interface
Method1() bool
Method2() bool
// Implement this interface
type Thing struct
func (t *Thing) Method1() bool
return true
func (t *Thing) Method2() bool
// I don't want to implement this yet
【问题讨论】:
成语重要吗?如果它对您有所帮助,恐慌或记录,那就足够了。 不一定重要,但我还在学习 Go,想了解正确的使用方法。 我觉得这个问题没有正确答案。接口是隐式实现的,所以如果你在这种情况下创建了接口,那么你应该只修改它或分成两个单独的接口。如果还没有,您可能应该阅读文档并弄清楚使用该接口的任何行为以及何时调用Method2
(例如,如果它是关闭文件并且您没有要关闭的文件,您可以什么都不做并返回成功)。总之,强烈建议您提供更多信息以获得更好的答案。
【参考方案1】:
这是 go 中的一种常见模式,在失败的情况下返回结果或错误。
import (
"errors"
"fmt"
)
func (t *Thing) Method2() (bool, error)
// I don't want to implement this yet
return nil, errors.New("Not implemented")
// Also return fmt.Errorf("Not implemented")
func (t *Thing) Method3() (bool, error)
return nil, fmt.Errorf("Not implemented")
【讨论】:
不错的解决方案 :-) go-staticcheck 告诉我error strings should not be capitalized (ST1005)
【参考方案2】:
func someFunc()
panic("someFunc not implemented")
【讨论】:
【参考方案3】:这是我在 Go 中实现 gRPC 生成的示例:
import (
status "google.golang.org/grpc/status"
)
// . . .
// UnimplementedInstanceControlServer can be embedded to have forward compatible implementations.
type UnimplementedInstanceControlServer struct
func (*UnimplementedInstanceControlServer) HealthCheck(ctx context.Context, req *empty.Empty) (*HealthCheckResult, error)
return nil, status.Errorf(codes.Unimplemented, "method HealthCheck not implemented")
或者,您可以在方法中记录错误,然后返回 nil 以满足方法协定。
【讨论】:
【参考方案4】:一个空的变量会这样做
var _ MyInterface = &Thing
如果Thing
没有实现接口MyInterface
,编译会失败
【讨论】:
【参考方案5】:通常在 golang 中,如果你想实现错误处理,你会返回一个错误
type MyInterface interface
Method1() bool
Method2() (bool, error)
然后你可以返回一个错误。 你也可以记录,或者像 @coredump 在 cmets 中所说的那样恐慌。
【讨论】:
以上是关于Golang 等价于 Python 的 NotImplementedException的主要内容,如果未能解决你的问题,请参考以下文章