Go中的算法相同,多输入输出类型可能吗?

时间:2018-03-01 13:35:24

标签: go

我目前正在使用draw2d lib来渲染一些图像。我注意到构建SVGPNG图像的核心算法和方法是相同的。

我需要将此图像渲染为SVG(供Web使用)和PNG(供PDF使用)

唯一的区别在于输入类型和输出。

用于PNG渲染我

作为输入:

var gc *draw2dimg.GraphicContext
var img *image.RGBA

img = image.NewRGBA(image.Rect(0, 0, xSize, ySize))
gc = draw2dimg.NewGraphicContext(img)

作为输出:

draw2dimg.SaveToPngFile(FileName, img)

对于SVG我:

作为输入:

var gc *draw2dsvg.GraphicContext
var img *draw2dsvg.Svg

img = draw2dsvg.NewSvg()
gc = draw2dsvg.NewGraphicContext(img)

作为输出:

draw2dsvg.SaveToSvgFile(FileName, img)

输入和输出之间我有相同的实现。

Go中是否有任何方法可以使用不同的输入类型并获得相同的实现而无需复制某些代码?

2 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,尝试通过将核心算法部分移动到函数中来重构代码,或者可以将其转换为不同的包。为了说明这个想法,下面是https://github.com/llgcode/draw2d自述文件中示例的重构版本。

<input type="hidden" [(ngModel)]="claimsReports.DealerId"  name="dealerId" (change)="saveParam($event,'DealerId')" />

答案 1 :(得分:0)

在Go中实现代码共享的典型方法是使用interfaces。看看你是否可以将图像算法的步骤分解为接口方法。然后,可以通过适用于所有图像格式的单个代码以通用方式驱动这些方法,如下面的runAlgorithm函数。

package main

import (
    "image"

    "github.com/llgcode/draw2d/draw2dimg"
    "github.com/llgcode/draw2d/draw2dsvg"
)

// Common algorithm that is implemented for various image formats.
type ImageAlgorithm interface {
    CreateImage(xSize, ySize int)
    CreateGraphicsContext()
    SaveImage(fileName string)
}

type RGBAAlgorithm struct {
    gc  *draw2dimg.GraphicContext
    img *image.RGBA
}

func (alg *RGBAAlgorithm) CreateImage(xSize, ySize int) {
    alg.img = image.NewRGBA(image.Rect(0, 0, xSize, ySize))
}

func (alg *RGBAAlgorithm) CreateGraphicsContext() {
    alg.gc = draw2dimg.NewGraphicContext(alg.img)
}

func (alg *RGBAAlgorithm) SaveImage(fileName string) {
    draw2dimg.SaveToPngFile(fileName, alg.img)
}

type SvgAlgorithm struct {
    gc  *draw2dsvg.GraphicContext
    img *draw2dsvg.Svg
}

func (alg *SvgAlgorithm) CreateImage(xSize, ySize int) {
    alg.img = draw2dsvg.NewSvg()
}

func (alg *SvgAlgorithm) CreateGraphicsContext() {
    alg.gc = draw2dsvg.NewGraphicContext(alg.img)
}

func (alg *SvgAlgorithm) SaveImage(fileName string) {
    draw2dsvg.SaveToSvgFile(fileName, alg.img)
}

func runAlgorithm(alg ImageAlgorithm) {
    // input
    alg.CreateImage(100, 100)
    alg.CreateGraphicsContext()

    // output
    alg.SaveImage("out")
}

func main() {
    runAlgorithm(&RGBAAlgorithm{})
    runAlgorithm(&SvgAlgorithm{})
}