Я в настоящее время пытаюсь найти Go и застрял в вышеупомянутом сообщении об ошибке. Посмотрите интерфейс, его реализацию для float64 и тест.Многозначное значение в контексте с одним значением
Интерфейс:
package interval
import (
"errors"
"fmt"
"math"
)
type Interval interface {
Intersect(Y Interval) (Interval, error) // Intersection of X and Y, error 'nil' when empty
}
type floatInterval struct {
a, b float64
}
func (fi floatInterval) Intersect(Y Interval) (Interval, error) {
tmp := Y.(floatInterval)
a_new, b_new := math.Max(fi.a, tmp.a), math.Min(fi.b, tmp.b)
result := floatInterval{a_new, b_new}
if result.Length() == 0 {
return result, errors.New("Empty interval")
} else {
return result, nil
}
}
Тест:
func intersect_test(t *testing.T, c testTuple) {
got, _ := c.iv1.Intersect(c.iv2).(floatInterval)
if (c.intersectWant.a != got.a) || (c.intersectWant.b != got.b) {
t.Errorf("Expected: [%f, %f] \t Got: [%f, %f]", c.intersectWant.a, c.intersectWant.b, got.a, got.b)
}
}
Ошибка возникает во второй строке функции тестирования. Я знаю, что intersect возвращает два значения: интервал и значение ошибки. Но поскольку я назначаю got, _ := c.iv1.Intersect(c.iv2).(floatInterval)
, я думал, что я в безопасности. Я также пробовал got, err := ...
. Это из-за преобразования типа, которое я делаю с .(floatInterval)
?
** Никогда ** использовать две переменной версии [типа утверждения] (https://golang.org/ref/spec#Type_assertions) и игнорировать вторую переменную (например, у вас есть строка, похожая на 'x, _: = something. (float64)'). Если вы действительно ожидаете/знаете тип, то просто используйте единственную версию переменной и пусть Go panic, если тип не соответствует тому, что вы ожидаете/знаете. Если вы этого не сделаете, проверьте переменную boolean second. Тест должен предполагать, что функция может что-то вернуть и проверить. –
Вы тестируете 'Intersect', поэтому на самом деле проверяете его возвращаемые значения. То есть не игнорируйте его «ошибка», но проверяйте/проверяйте/проверяйте. (например, если функция вернет правильный ответ, но с ошибкой, отличной от нуля, то это неправильно, и ваш тест не сможет ее выполнить). –