理解不转换不必要的转换警告

  • 本文关键字:转换 警告 不必要 go
  • 更新时间 :
  • 英文 :


warning: unnecessary conversion (unconvert)

来自下面一行:

offsetY += 60 + image.Image(*img.Bitmap).Bounds().Max.Y

我花了一段时间才理解如何将这个接口指针转换为一个接口,但我不认为这是正确的解决方案,因为gomez talinter会发出警告。

我想得到img的宽度。img是结构Image,并有一个指向真正的image.Image(图像标准库)的位图指针。如果我想在实际的image.Image上调用Bounds,我需要将指向接口的指针转换为接口。

如何以更友好的方式做到这一点?

我有以下go代码:

import (
    "image"
    "image/color"
    "image/draw"
)
type Image struct {
    Src    string
    Title  string
    Width  int
    Height int
    Index  int
    Bitmap *image.Image
}
type Images []Image
offsetY = 10
func ComposeImage(imgs Images) image.Image {
    masterRGBAImg := image.NewRGBA(image.Rect(0, 0, 300, 300))
    masterBounds := masterRGBAImg.Bounds()
    for _, img := range imgs {
        draw.Draw(masterRGBAImg, masterBounds,
            *img.Bitmap, image.Point{X: -10, Y: -offsetY + 10}, draw.Src)

        addLabel(masterRGBAImg, 10, offsetY-30, img.Title)
        // HERE ======
        offsetY += 60 + image.Image(*img.Bitmap).Bounds().Max.Y
        // END ======
    }
    return masterRGBAImg
}
// Draw label on image.
func addLabel(img *image.RGBA, x int, y int, label string) {
    col := color.RGBA{50, 50, 50, 255}
    point := fixed.Point26_6{X: fixed.Int26_6(x * 64), Y: fixed.Int26_6(y * 64)}
    d := &font.Drawer{
        Dst:  img,
        Src:  image.NewUniform(col),
        Face: inconsolata.Bold8x16,
        Dot:  point,
    }
    d.DrawString(label)
}

首先,位图字段是一个*image.Image,所以它是相同的类型,当你可以解引用它时,你不需要转换它。

(*img.Bitmap).Bounds()

但是,image.Image是一个接口。指向接口的指针几乎总是一个编程错误。

将结构体定义更改为

type Image struct {
    Src    string
    Title  string
    Width  int
    Height int
    Index  int
    Bitmap image.Image
}

然后直接调用img.Bitmap.Bounds()

最新更新