Con Go v1.14.3, intento hacer lo siguiente:

package main

import (
    "os"

    "github.com/mihaigalos/go-bar/bar"
)

var progressBar bar.Bar

func (*ProgressHandler) New(begin int, end int) {
    progressBar.New(begin, end)
}

func main() {
    var progressHandler ProgressHandler
    send(&progressHandler)
}

Hasta ahora tan bueno. Pero cuando pruebo, no necesito ver ninguna barra de progreso, por lo tanto, mi ProgressHandler puede estar vacío, y quiero inyectar dependencia-inyectar este objeto en send(). En su interior llamará a mi New() especificado.

package main

import (
    "testing"
)
func (*ProgressHandler) New(int, int) {
}

func TestSendWorks_whenTypical(t *testing.T) {
    expected := true
    var progressHandler ProgressHandler

    actual := send(&progressHandler)

    if actual != expected {
        t.Errorf("No Match: %b != %b", actual, expected)
    }
}

Cuando compilo esto, obtengo una colisión de nombres con los controladores definidos en main:

integration_typical_test.go:23:25: (*ProgressHandler).New redeclared in this block
    previous declaration at main.go:15:6

Intenté cambiar el nombre del paquete a algo diferente. El mismo error allí. ¿Cómo puedo mejorar aquí?

go
-1
Mihai Galos 23 ene. 2021 a las 14:17

1 respuesta

La mejor respuesta

Utilice una interfaz .

type ProgressBar interface {
    New(int, int)
}

var progressBar bar.Bar

// New implements ProgressBar
func (*ProgressHandler) New(begin int, end int) {
    progressBar.New(begin, end)
}

// change *ProgressHandler to ProgressBar
func send(pb ProgressBar) {
    // ...
}

func main() {
    var progressHandler ProgressHandler
    send(&progressHandler)
}
package main

import (
    "testing"
)

type fakeProgressHandler struct{}

func (*fakeProgressHandler) New(int, int) {
}

func TestSendWorks_whenTypical(t *testing.T) {
    expected := true
    var progressHandler fakeProgressHandler

    actual := send(&progressHandler)

    if actual != expected {
        t.Errorf("No Match: %b != %b", actual, expected)
    }
}

Manejar el receptor nil en el manejador.

package main

import (
    "os"

    "github.com/mihaigalos/go-bar/bar"
)

var progressBar bar.Bar

func (h *ProgressHandler) New(begin int, end int) {
    if h == nil {
        return
    }
    progressBar.New(begin, end)
}

func main() {
    var progressHandler ProgressHandler
    send(&progressHandler)
}
package main

import (
    "testing"
)

func TestSendWorks_whenTypical(t *testing.T) {
    expected := true

    actual := send(nil)

    if actual != expected {
        t.Errorf("No Match: %b != %b", actual, expected)
    }
}
1
mkopriva 23 ene. 2021 a las 12:26