我刚学习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)
不指示指针接收器吗?
答案 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)
}
必须在指针上访问在指针接收器上定义的方法。但是只能在结构上定义的方法可以从指针或值访问。
以下是一些文档,解释了方法的指针或值接收器之间的区别: