naicolas
naicolas

Reputation: 148

Treat Golang defined type as the underlying one?

I'm new to the Go. I understand the basics of defining new types like below:

type MyCondition bool

I know this implies that whenever I state a function takes an instance of MyCondition it cannot be a bool, and that's great. However, I would like to treat an instance of MyCondition as if it was a bool, and I've found I can't always do that:

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)
}

This doesn't compile, throwing:

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

From what I've observed, MyCondition works as a bool on its own, but the problem occurs when I "mix" it with an actual bool.

Questions are:

  1. Why does this happen?
  2. What's a workaround for this? I'd really like to treat it like a bool without the need of casting, polymorphically.

Upvotes: 0

Views: 157

Answers (2)

Amairgen
Amairgen

Reputation: 1

You can use aliases(pay attention to type definition) as a workaround, but in this case, you will lose guarantees of safety of types.

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
}

Upvotes: -1

for_stack
for_stack

Reputation: 22886

You cannot do that. You have to convert MyCondition to bool explicitly, i.e. bool(b1) || b2.

From Go spec:

Logical operators apply to boolean values and yield a result of the same type as the operands.

If the left operand and the right operand have different types, the compiler can't decide the result type. So these two operands must be of the same type.

Upvotes: 4

Related Questions