强制 Go 类型实现接口

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

在Go中,你不需要声明你需要实现一个接口,你只需要做(这被称为“结构类型”,类似于动态语言中的“鸭子类型”)。 如果您想强制类型实现接口(例如,当您在 C# 或 Java 中“继承”接口时)怎么办?换句话说,如果忘记实现接口(或签名错误)是一个错误,并且您希望尽早发现该错误,该怎么办?最好的方法是什么?

go
2个回答
7
投票

您可以做的最好的事情就是尝试将类型的实例分配给接口变量

例如,您想确保类型

A
实现
Stringer
接口。

你可以这样做

var _ Stringer = (*A)(nil) //or
var _ Stringer = A{}

这里是示例程序,在示例中

A
实现了接口,而
B
没有实现

package main

import (
    "fmt"
)

type Stringer interface {
   String() string
}

type A struct {
}

func (a A) String() string {
    return "A"
}

type B struct {}


var _ Stringer = new(A)
var _ Stringer = new(B)

func main() {

    fmt.Println("Hello, playground")
}

播放链接在这里:play.golang


0
投票

完成@Sarathsp 所说的话: 基本上,通过声明接口类型的虚拟变量(下划线表示未使用它),同时将类型的实例分配给它,您会得到非常明确的编译时错误:

    type MyType struct {
    }

    func (*MyType) Read() {

    }

    var _ io.Reader = &MyType{}


cannot use MyType literal (type *MyType) as type io.Reader in assignment:
        *MyType does not implement io.Reader (missing Read method)

Or

cannot use MyType literal (type *MyType) as type io.Reader in assignment:
        *MyType does not implement io.Reader (wrong type for Read method)
                have Read()
                want Read([]byte) (int, error)
© www.soinside.com 2019 - 2024. All rights reserved.