为什么我必须导入“图像/颜色”和“图像”?

时间:2012-12-24 04:58:53

标签: go

我刚学习Go并编写了以下结构(Image)来实现image.Image接口。

package main

import (
    "image"
    "image/color"
    "code.google.com/p/go-tour/pic"
)

type Image struct{}

func (img Image) ColorModel() color.Model {
    return color.RGBAModel
}

func (img Image) Bounds() image.Rectangle {
    return image.Rect(0, 0, 100, 100)
}

func (img Image) At(x, y int) color.Color {
    return color.RGBA{100, 100, 255, 255}   
}

func main() {
    m := Image{}
    pic.ShowImage(m)
}

如果我只导入image/color而不导入image,则image.Rect未定义。为什么? image/color不应该涵盖image的方法和属性吗?

此外,如果我将函数接收器从(img Image)更改为(img *Image),则会出现错误:

Image does not implement image.Image (At method requires pointer receiver)

为什么? (img *Image)不指示指针接收器吗?

1 个答案:

答案 0 :(得分:9)

如果您查看source for the image package及其子包,您将会看到image/color does not depend on image,因此它永远不会导入它。

image does however import image/color

对于问题的第二部分,您将所有接收器更改为指针,这意味着您还应该将图像指针传递给ShowImage

func main() {
    m := Image{}
    pic.ShowImage(&m)
}

必须在指针上访问在指针接收器上定义的方法。但是只能在结构上定义的方法可以从指针或值访问。

以下是一些文档,解释了方法的指针或值接收器之间的区别:

  1. Should I define methods on values or pointers?
  2. Why do T and *T have different method sets?