Reputation: 148
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:
Upvotes: 0
Views: 157
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
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