繁体   English   中英

练习:图像中的指针接收器和值接收器

[英]Pointer receiver and value receiver in Exercise:Image

我很新,对Go中的接收者想法很困惑。 这是“ A Go之旅”中的练习。

问题正文:

还记得您之前写的图片生成器吗? 我们再写一个,但是这次它将返回image.Image的实现,而不是数据切片。

定义自己的Image类型,实现必要的方法,然后调用pic.ShowImage。

边界应返回image.Rectangle,如image.Rect(0,0,w,h)。

ColorModel应该返回color.RGBAModel。

应返回颜色; 最后一个图片生成器中的值v对应于此图片生成器中的color.RGBA {v,v,255,255}。

这是我的代码:

package main

import "golang.org/x/tour/pic"
import "image"
import "image/color"


type Image struct{}

func (img *Image) Bounds() image.Rectangle{
    w := 100
    h := 100
    return image.Rect(0,0,w,h)
}

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

func (img *Image) At(x int, y int) color.Color{
    return color.RGBA{uint8(x^y), uint8(y/2), 255,255}
}

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

并且它将报告编译错误:

命令行参数./compile110.go:26:不能使用m(Image类型)作为image类型。pic.ShowImage参数中的Image:Image不实现image.Image(At方法具有指针接收器)


我的理解是,对于方法的接收者,可以将它们设置为指针或值。 但是,当我将所有“ * Image”都设置为“ Image”时,错误消失了。

有人可以帮我弄这个吗?


下面提供的答案足以解决我提出的问题。 但是,指针和值接收器似乎有点复杂。

从有效执行:

关于指针与接收器的值的规则是,可以在指针和值上调用值方法,但是只能在指针上调用指针方法。 之所以出现此规则,是因为指针方法可以修改接收者。 在值上调用它们将导致该方法接收该值的副本,因此任何修改都将被丢弃。 因此,该语言不允许出现此错误。 但是,有一个方便的例外。 当该值是可寻址的时,该语言将通过自动插入地址运算符来处理在值上调用指针方法的常见情况。

希望这对您有所帮助。

在Go中使用接口时,您需要确保所使用的实例实现了该接口。 在Go-Tour示例问题中, Image不满足image.Image接口,只有&Image满足。

因此,您需要更改方法签名以获取使Image工作的值接收器,或者将&Image传递给pic.ShowImage函数,因为指向Image的指针确实实现了该接口。

有两种方法可以解决此问题。

一种方法是使用

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

另一种方法是使用构造函数

func NewImage() *Image {
    return &Image{}
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM