是否可以扩展go struct constructors?

时间:2017-04-21 14:47:34

标签: go

给出

type Rectangle struct {
    h, w int
}

func (rec *Rectangle) area() int {
    return rec.w * rec.h
}

你能用Rectangle定义一个Square结构,所以我可以使用area方法吗?如果不可能,那绝对没问题。我不会判断语言或哭泣或不高兴。我只是在学习golang。

2 个答案:

答案 0 :(得分:2)

Go不是经典的面向对象,所以它没有继承性。它也没有构造函数。它的功能是嵌入。因此这是可能的:

type Rectangle struct {
    h, w int
}

func (rec *Rectangle) area() int {
    return rec.w * rec.h
}

type Square struct {
    Rectangle
}

此处的主要限制是,area()方法无法访问仅存在于Square中的字段。

答案 1 :(得分:0)

我开始知道实现此行为的预期方法是编写普通函数。见MakeSquare

type Rectangle struct {
    h, w int
}

func (rec *Rectangle) area() int {
    return rec.w * rec.h
}

type Square struct {
    Rectangle
}

func MakeSquare(x int) (sq Square) {
    sq.h = x
    sq.w = x
    return
}

func Test_square(t *testing.T) {
    sq := MakeSquare(3)
    assert.Equal(t, 9, sq.area())
}