由于我来自Java并且是Golang的新手,我将尝试用Java解释我想要的内容。
interface Car { }
class MyCarA implements Car {
int specificToA
}
class MyCarB implements Car {
int specificToB
}
我认为这样的界面(如Car)在Java中称为标记界面。它只是表明编译器必要的抽象。
我怎样才能在Golang中做到这一点?
我有
type MyCarA struct {
specificToA int
}
type MyCarB struct {
specificToB int
}
我现在如何概括这些结构?它应该是一个接口还是另一个结构?
答案 0 :(得分:5)
你可以这样做:
type Car interface { IAmACar() }
type MyCarA struct {
specificToA int
}
func (MyCarA) IAmACar() {}
type MyCarB struct {
specificToB int
}
func (MyCarB) IAmACar() {}
测试标记
_, itIsACar := v.(Car)
Car界面也可用于静态检测错误:
var c Car
c = MyCarA{0} // ok
c = 0 // error, int is not a car
答案 1 :(得分:0)
上述方法是正确的&适用于运行时检测,但它不能提供编译时检测。如果要进行编译时检测,请将类型传递给以接口作为参数并检查的函数。见下面的示例:
package main
import "fmt"
type MyType struct {
a int
b int
}
type NotMyType struct {
a int
b int
}
type Printer interface {
Print(a string) error
}
func (m *MyType) Print(s string) error {
fmt.Println(m.a, m.b, s)
return nil
}
//Uncomment following function to see compilation work
// func (m *NotMyType) Print(s string) error {
// fmt.Println(m.a, m.b, s)
// return nil
// }
func main() {
t := &MyType{
a: 1, b: 2,
}
t1 := &NotMyType{
a: 1, b: 2,
}
checkPrintable(t)
checkPrintable(t1)
}
func checkPrintable(p Printer) {
p.Print("Test message")
}
要使其工作,您需要取消注释NotMyType的打印功能。
希望这有帮助。