【问题标题】:Treat Golang defined type as the underlying one?将 Golang 定义的类型视为底层类型?
【发布时间】:2019-10-21 12:46:50
【问题描述】:

我是 Go 新手。我了解定义新类型的基础知识,如下所示:

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“混合”时就会出现问题。

问题是:

  1. 为什么会这样?
  2. 对此有什么解决方法?我真的很想把它当作一个 bool 来处理,而不需要多态地进行强制转换。

【问题讨论】:

    标签: go types polymorphism


    【解决方案1】:

    你不能那样做。您必须将MyCondition 显式转换为bool,即bool(b1) || b2

    来自Go spec

    逻辑运算符适用于布尔值并产生与操作数相同类型的结果。

    如果左操作数和右操作数的类型不同,编译器无法确定结果类型。所以这两个操作数必须是同一类型。

    【讨论】:

    【解决方案2】:

    您可以使用别名(注意类型定义)作为解决方法,但在这种情况下,您将失去对类型安全性的保证。

    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
    }
    

    【讨论】:

    • 别名和类型定义不可互换。
    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多