强制Go类型实现接口

时间:2016-12-26 09:38:56

标签: go

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

2 个答案:

答案 0 :(得分:2)

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

例如,您希望确保A类型实现Stringer接口。

你可以这样做

var _ Stringer = new(A) //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

答案 1 :(得分: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)
相关问题