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)ポインターレシーバーを示していませんか?

4

1 に答える 1

10

パッケージとそのサブパッケージのソースimageをチェックアウトすると、image/colorがまったく依存していないimageことがわかるため、インポートされません。

imageただし、インポートしますimage/color

質問の 2 番目の部分では、すべてのレシーバーをポインターに変更します。つまり、Image ポインターをShowImage次の場所にも渡す必要があります。

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

ポインター レシーバーで定義されたメソッドには、ポインターでアクセスする必要があります。ただし、構造体だけで定義されたメソッドには、ポインターまたは値からアクセスできます。

メソッドのポインターまたは値レシーバーの違いを説明するドキュメントを次に示します。

  1. 値またはポインターに対してメソッドを定義する必要がありますか?
  2. T と *T のメソッドセットが異なるのはなぜですか?
于 2012-12-24T05:26:20.997 に答える