• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go 自定义类型来实现枚举类型限制

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

今天使用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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go Web 使用工具发布时间:2022-07-10
下一篇:
[GO]json解析到map发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap