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的主要内容,如果未能解决你的问题,请参考以下文章

Java 等价于 Python 字典

Javascript 等价于 python 的 .format()

Java 等价于 Python repr()?

Python 等价于 SQL Rank

Python 等价于 unix cksum 函数

Python 等价于 Java StringBuffer?