2015-08-20 18:36


  • types
  • methods

In order to prevent having multiple dependencies along different files of my project and since I might change how data will be presented, I decided to make an "interface" (not in the golang sense but in an architectural way) to the draw2d package

As I didn't need anything else, I just renamed one of the types:

type CanvasContext draw2dimg.GraphicContext

In one of my modules I had the following code (path is a CanvasContext variable):

// initialization and some code omitted for clarity
path.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff})
path.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff})
// some more code here

Among all those method calls on path, only the FillStroke failed with the compile error:

path.FillStroke undefined (type *drawing.CanvasContext has no field or method FillStroke)

In order to prevent it I have to redefine the FillStroke, but not any other method, with:

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

Why do I have to redefine only that one and not any of the other calls?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答


  • duanbiao4025 duanbiao4025 6年前

    you should use struct embedding rather than type define. check the struct 'embedding' document:

    but then to promote the methods of the fields and to satisfy the io interfaces, we would also need to provide forwarding methods, like this:

    func (rw *ReadWriter) Read(p []byte) (n int, err error) { return rw.reader.Read(p) }

    By embedding the structs directly, we avoid this bookkeeping.

    点赞 评论 复制链接分享