Golang 相当于 Python 的 NotImplementedException

问题描述 投票:0回答:6

当你定义一个带有你不想实现的方法的接口时,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
}
python oop go error-handling idioms
6个回答
8
投票
func someFunc() {
   panic("someFunc not implemented")
}

5
投票

这是我在 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
投票

这是 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")
}

1
投票

通常在 golang 中,如果你想实现错误处理,你会返回一个错误

type MyInterface interface {
    Method1() bool
    Method2() (bool, error)
}

然后就可以返回错误了。 您还可以记录,或者像 @coredump 在评论中所说的那样恐慌。


1
投票

一个空的变量可以做到这一点

var _ MyInterface = &Thing{}

如果

Thing
没有实现接口
MyInterface
,编译会失败


0
投票

如果该方法不能被调用(还?),因为它还没有实现,那么恐慌是正确的做法(尽早失败)。

func (t *Thing) Method2() bool {
    panic("Not implemented")
}

您可以更进一步并使用真正的

error

func (t *Thing) Method2() bool {
    panic(errors.New("Not implemented"))
}

但我认为这是没有必要的,因为这种失败不应该在运行时被捕获(

recover
ed)。相反,它的存在只是为了告诉开发人员他应该使用其他东西,所以他应该在早期测试期间看到该消息并修复它。

请注意,Go 1.21 已添加 errors.ErrUnsupported

,您也可以使用:

func (t *Thing) Method2() bool { panic(errors.ErrUnsupported) }
    
© www.soinside.com 2019 - 2024. All rights reserved.