zoukankan      html  css  js  c++  java
  • Go 自定义类型来实现枚举类型限制

    今天使用iota 发现一个问题。定义别名类型的时候 调用函数报错。废话不多说,我们看一段示例(关于iota的用法这里就不介绍了,手册介绍滴比较详细):

    package main
    
    import "fmt"
    
    type Aliasint int // 定义int 的别名 为Aliasint
    
    const (
        AA Aliasint = iota //初始化 0
        BB                 // 1
        CC                 // 2
    )
    
    func test(m Aliasint) { fmt.Println(m) }
    
    func main() {
        m := AA
        test(m)
        x := 1
        test(x)
        // cannot use x (type int) as type Aliasint in argument to test
    }

    报错的意思是:不能在参数中使用x(type int)作为类型Aliasint来测试

    分析:因为int 被别名化了。使用额外同类型变量不被支持,为啥?因为 x := 1这里 x 被隐试定义为了int, 而int不再是所谓的"int",而是 Aliasint.
    怎么理解? 如果我们这样,那就没问题,继续看:

    package main
    
    import "fmt"
    
    //type Aliasint int // 定义int 的别名 为Aliasint
    
    const (
        AA int = iota //初始化 0
        BB                 // 1
        CC                 // 2
    )
    
    func test(m int) { fmt.Println(m) }
    
    func main() {
        m := AA
        test(m)
        x := 1
        test(x)
    }

    输出:

    0
    1

    我们看到不使用别名正常输出。那么,使用别名如何调用函数传参?

    package main
    
    import "fmt"
    
    type Aliasint int // 定义int 的别名 为Aliasint
    
    const (
        AA Aliasint = iota //初始化 0
        BB                 // 1
        CC                 // 2
    )
    
    func test(m Aliasint) { fmt.Println(m) }
    
    func main() {
        m := AA
        test(m)
        test(110) // 常量会被编译器自动转换
    }

    输出:

    0
    110

    结论:自定义类型必须使用别名类型的变量名定义,因为此时别名类型被"覆盖了"。继续,我们看了下面这段代码,相信大家也理解啦:

    package main
    
    import "fmt"
    
    type Aliasint int // 定义int 的别名 为Aliasint
    
    const (
        AA Aliasint = iota //初始化 0
        BB                 // 1
        CC                 // 2
    )
    
    func test(m Aliasint) { fmt.Println(m) }
    
    func main() {
        m := AA
        test(m)
        var x Aliasint
        x = 99
        test(x)
    }

    输出:

    0
    99
  • 相关阅读:
    ArcGIS Server TileLayer 跨域读取
    dojo.declare 未定义
    注册部署SOE, 提交SOE只能在IE浏览器中
    在maptalks中加载三维模型obj,fbx,glb
    三维模型 obj 转化为 three Json 文件格式
    leaflet map 地图初始化不能铺满div
    查找进行的过程中被停止 解决办法
    逆向的第一个小代码
    编码不规范导致的错误
    android4.4.2 短信广播变更
  • 原文地址:https://www.cnblogs.com/phpper/p/11913400.html
Copyright © 2011-2022 走看看