Условная проверка с И и ИЛИ не проходит - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь объединить несколько условных проверок

package main

import (
    "fmt"
    "reflect"
)

type ActionType string

const (
    VNFHealthCheck ActionType = "vnf-health-check"
    CollectAlaramAddToReport    ActionType = "write-initial-report"
    CollectResourcesAddCounters ActionType = "abc"
)

func main() {
    var action, operationType interface{}
    action = nil
    operationType = "vnf-health-check"
    if operationType == string(VNFHealthCheck) && action != nil && action.(ActionType) == CollectAlaramAddToReport {
        fmt.Println("Type is ", reflect.TypeOf(action))
    }
}

Приведенный выше код ничего не печатает, так как action! = Nil проверка не пройдена.

Но когда условие меняется на

if operationType == string(VNFHealthCheck) && action != nil && action.(ActionType) == CollectAlaramAddToReport || action.(ActionType) == CollectResourcesAddCounters {
        fmt.Println("Hello, playground", reflect.TypeOf(action))
    }

Паника видна с сообщением паника: преобразование интерфейса: интерфейс {} равен nil, а не main.ActionType

Если проверка условий работает нормально после добавления () вокруг условия ИЛИ

if operationType == string(VNFHealthCheck) && action != nil && (action.(ActionType) == CollectAlaramAddToReport || action.(ActionType) == CollectResourcesAddCounters) {
        fmt.Println("Hello, playground", reflect.TypeOf(action))
    }

Что может быть причиной поведения.? Я не мог найти никакого объяснения.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

&& имеет более высокий приоритет, чем ||

в первом состоянии,

operationType == string(VNFHealthCheck) && action != nil && action.(ActionType) == CollectAlaramAddToReport || action.(ActionType) == CollectResourcesAddCounters

причина action равна nil, условие становится false || action.(ActionType) == CollectResourcesAddCounters. nil заклинание вызывает панику

второе условие становится false && (action.(ActionType) == CollectAlaramAddToReport || action.(ActionType) == CollectResourcesAddCounters). вызовите false короткое замыкание выражения, приведение не будет выполнено.

1 голос
/ 17 апреля 2019

См. Раздел приоритета оператора спецификации .Оператор && имеет более высокий приоритет, чем ||.Круглые скобки необходимы для получения желаемой группировки.

При сравнении значения с interface{} утверждение типа не требуется.Если action является одним из указанных значений, то из этого следует, что action != nil.Используя эти наблюдения, упростим код до:

if operationType == string(VNFHealthCheck) && (action == CollectAlaramAddToReport || action == CollectResourcesAddCounters) {
        fmt.Printf("Hello, playground %T\n", action)
}
...