2015-04-14 3 views
2

Я в настоящее время пытаюсь найти 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)?

+1

** Никогда ** использовать две переменной версии [типа утверждения] (https://golang.org/ref/spec#Type_assertions) и игнорировать вторую переменную (например, у вас есть строка, похожая на 'x, _: = something. (float64)'). Если вы действительно ожидаете/знаете тип, то просто используйте единственную версию переменной и пусть Go panic, если тип не соответствует тому, что вы ожидаете/знаете. Если вы этого не сделаете, проверьте переменную boolean second. Тест должен предполагать, что функция может что-то вернуть и проверить. –

+1

Вы тестируете 'Intersect', поэтому на самом деле проверяете его возвращаемые значения. То есть не игнорируйте его «ошибка», но проверяйте/проверяйте/проверяйте. (например, если функция вернет правильный ответ, но с ошибкой, отличной от нуля, то это неправильно, и ваш тест не сможет ее выполнить). –

ответ

6

Это из-за утверждения типа, которое принимает только одно значение.

ли это вместо:

gotInterval, _ := c.iv1.Intersect(c.iv2) 
got := gotInterval.(floatInterval) 
+0

Делает удовольствие, спасибо! – DenverCoder21

Смежные вопросы