Methods 重命名类型后,我无法访问其某些方法

Methods 重命名类型后,我无法访问其某些方法,methods,types,go,Methods,Types,Go,为了防止在我的项目的不同文件中存在多个依赖项,并且由于我可能会更改数据的显示方式,我决定为 因为我不需要其他任何东西,我只是重命名了其中一种类型: type CanvasContext draw2dimg.GraphicContext 在我的一个模块中,我有以下代码(path是一个CanvasContext变量): 在path上的所有方法调用中,只有FillStroke失败并出现编译错误: path.FillStroke未定义(类型*drawing.CanvasContext没有字段或 方法(

为了防止在我的项目的不同文件中存在多个依赖项,并且由于我可能会更改数据的显示方式,我决定为

因为我不需要其他任何东西,我只是重命名了其中一种类型:

type CanvasContext draw2dimg.GraphicContext
在我的一个模块中,我有以下代码(path是一个CanvasContext变量):

在path上的所有方法调用中,只有FillStroke失败并出现编译错误:

path.FillStroke未定义(类型*drawing.CanvasContext没有字段或 方法(笔划)

为了防止出现这种情况,我必须使用以下方法重新定义FillStroke,而不是任何其他方法:

func (cc *CanvasContext) FillStroke() {
    gc := draw2dimg.GraphicContext(*cc)
    gc.FillStroke()
}

为什么我必须只重新定义这一个调用而不重新定义任何其他调用?

您应该使用结构嵌入而不是类型定义。检查结构“”文档:

但是为了推广这些领域的方法并满足io 接口,我们还需要提供转发方法,如 这:

func(rw*ReadWriter)读取(p[]字节)(n int,err error){ 返回rw.reader.Read(p)}

通过直接嵌入结构,我们避免了这种记账


draw2dimg
包将类型
GraphicContext
定义为嵌入另一种实现大多数方法的类型。但是,
FillStroke
方法仅在
GraphicContext
上直接实现。如果您使用嵌入,它将像您期望的那样工作,如果不使用,它将不会工作。看见(也就是说,
输入Foo Bar
不会使
Bar
的方法可用,请使用嵌入)。虽然我仍然不知道这个决定背后的原因,但我可以通过您的示例看出我的代码中有什么错误。如果你回答这个问题(而不是评论),我会将你的答案标记为有效:D
func (cc *CanvasContext) FillStroke() {
    gc := draw2dimg.GraphicContext(*cc)
    gc.FillStroke()
}