Рассматривать определенный тип Голанга как основной? - PullRequest
1 голос
/ 06 июня 2019

Я новичок в Голанге. Я понимаю основы определения новых типов, как показано ниже:

type MyCondition bool

Я знаю, это означает, что всякий раз, когда я заявляю, что функция берет экземпляр MyCondition, она не может быть bool, и это здорово. Однако я хотел бы обработать экземпляр MyCondition, как если бы он был bool, и я обнаружил, что не всегда могу сделать это:

package main

import (
    "fmt"
)

type MyCondition bool

func main() {
    var b1 MyCondition
    var b2 = true
    fmt.Println(!b1) // OK!
    fmt.Println(b1 || b1) // OK
    fmt.Println(b1 || b2)
}

Это не компилируется, бросая:

./prog.go:13:17: invalid operation: b1 || b2 (mismatched types MyCondition and bool)

Из того, что я наблюдал, MyCondition сам по себе работает как bool, но проблема возникает, когда я "смешиваю" его с фактическим bool.

Вопросы:

  1. Почему это происходит?
  2. Какой обходной путь для этого? Я бы очень хотел относиться к нему как к буру без полимеризации.

Ответы [ 3 ]

4 голосов
/ 06 июня 2019

Вы не можете этого сделать.Вы должны преобразовать MyCondition в bool явно, то есть bool(b1) || b2.

Из Перейти спецификации :

Логические операторы применяются к логическим значениям ипривести к результату того же типа, что и операнды.

Если левый операнд и правый операнд имеют разные типы, компилятор не может определить тип результата.Таким образом, эти два операнда должны быть одного типа.

2 голосов
/ 06 июня 2019

1.Почему это происходит?

Го - строго типизированный язык. Так что это по замыслу. Это обеспечивает правильность кода и определенно исключает определенные классы ошибок программирования.

  1. Какой обходной путь для этого? Мне бы очень хотелось относиться к этому как к буру без полимеризации.

Обходные:
1. Не используйте новый именованный тип, просто используйте bool, если вам не нужны преимущества.
2. Используйте преобразование типов, например bool(b1) или MyCondition(b2) удачно.
3. Используйте Метод набора, чтобы конвертировать или выполнять больше заданий удачно.
4. Используйте тип Go псевдоним (начиная с Go 1,9 ): type MyCondition = bool.

Когда вы используете новое имя типа для bool, вы просите компилятор строго проверить тип и этот класс ошибок программирования. Поэтому, если вам не нужна такая помощь компилятора, не используйте новый именованный тип, просто используйте bool.

И здесь стоит отметить Наборы методов и их использование:

Вы можете использовать новый метод, например, ToBool, чтобы сделать это преобразование типов и больше, если вам нужно, попробуйте this :

package main

import "fmt"

type MyCondition bool

func (c MyCondition) ToBool() bool {
    return bool(c)
}

func main() {
    var b1 MyCondition
    var b2 = true
    fmt.Println(b2)  // true
    b2 = b1.ToBool() // b1.bool()
    fmt.Println(b2)  // false
}

Соответствующие ссылки:

Тип Преобразование :

Преобразование изменяет тип выражения на указанный тип по конверсии. Конверсия может появиться буквально в источнике, или это может подразумеваться контекстом, в котором появляется выражение.

Явное преобразование - это выражение вида T (x), где T - это type и x - это выражение, которое можно преобразовать в тип T.

Conversion = Type "(" Expression [ "," ] ")" .

Типовые утверждения для типов интерфейса.

Тип личности

Псевдонимы

0 голосов
/ 06 июня 2019

Вы можете использовать псевдонимы (обратите внимание на определение типа) в качестве обходного пути, но в этом случае вы потеряете гарантии безопасности типов.

package main

import (
    "fmt"
)

type MyCondition = bool

func main() {
    var b1 MyCondition
    var b2 = true
    fmt.Println(!b1) // OK!
    fmt.Println(b1 || b2)
    fmt.Println(foo(b2))
}

func foo(b MyCondition) bool {
    return !b
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...