2

我刚刚学习 Go 并编写了以下 struct( 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)
}

如果我只是 importimage/color而不是 import imageimage.Rect则未定义。为什么?不应该image/color已经涵盖的方法和属性image

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

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

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

4

1 回答 1

10

如果您查看及其子包的源代码,您会发现它imageimage/color根本不依赖image,因此它永远不会导入它。

image然而确实进口image/color

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

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

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

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

  1. 我应该在值或指针上定义方法吗?
  2. 为什么 T 和 *T 有不同的方法集?
于 2012-12-24T05:26:20.997 回答