如何在Golang中创建没有字段或方法的顶级对象?

时间:2017-06-22 04:32:58

标签: go

由于我来自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
}

我现在如何概括这些结构?它应该是一个接口还是另一个结构?

2 个答案:

答案 0 :(得分:5)

你可以这样做:

type Car interface { IAmACar() }

type MyCarA struct {
  specificToA int
}
func (MyCarA) IAmACar() {}

type MyCarB struct {
  specificToB int
}
func (MyCarB) IAmACar() {}

您使用type assertion

测试标记
_, itIsACar := v.(Car)

playground example

Car界面也可用于静态检测错误:

var c Car
c = MyCarA{0} // ok
c = 0 // error, int is not a car

go/ast包做了类似的事情。请参阅文件exprNode中函数ast.go的使用。

答案 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的打印功能。

希望这有帮助。