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()
}