2012-12-24 96 views
2

我剛剛學習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,而不是導入imageimage.Rect是不確定的。爲什麼?不應該image/color已經涵蓋了image的方法和屬性?

另外,如果我改變從(img Image)功能接收器(img *Image),錯誤出現了:

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

這是爲什麼? (img *Image)是否指示指針接收器?

回答

8

如果您查看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?