Go 自定义类型来实现枚举类型限制
今天使用iota 发现一个问题。定义别名类型的时候 调用函数报错。废话不多说,我们看一段示例(关于iota的用法这里就不介绍了,手册介绍滴比较详细):
package main import "fmt" type Aliasint int // 定义int 的别名 为Aliasint const (
AA Aliasint = iota //初始化 0
BB //
CC //
) func test(m Aliasint) { fmt.Println(m) } func main() {
m := AA
test(m)
x :=
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 //
CC //
) func test(m int) { fmt.Println(m) } func main() {
m := AA
test(m)
x :=
test(x)
}
输出:
我们看到不使用别名正常输出。那么,使用别名如何调用函数传参?
package main import "fmt" type Aliasint int // 定义int 的别名 为Aliasint const (
AA Aliasint = iota //初始化 0
BB //
CC //
) func test(m Aliasint) { fmt.Println(m) } func main() {
m := AA
test(m)
test() // 常量会被编译器自动转换
}
输出:
结论:自定义类型必须使用别名类型的变量名定义,因为此时别名类型被"覆盖了"。继续,我们看了下面这段代码,相信大家也理解啦:
package main import "fmt" type Aliasint int // 定义int 的别名 为Aliasint const (
AA Aliasint = iota //初始化 0
BB //
CC //
) func test(m Aliasint) { fmt.Println(m) } func main() {
m := AA
test(m)
var x Aliasint
x =
test(x)
}
输出:
Go 自定义类型来实现枚举类型限制的更多相关文章
- 基于自定义Validator来验证枚举类型
基于自定义Validator来验证枚举类型 一.背景 二.技术要点 三.实现一个自定义枚举校验. 1.需求. 2.实现步骤 1.自定义一个 Sex 枚举. 2.自定义一个 Enum 注解 3.编写具体 ...
- 实现自定义集合的可枚举类型(IEnumerable)和枚举数(IEnumerator )
下面的代码示例演示如何实现自定义集合的 IEnumerable 和 IEnumerator 接口: using System; using System.Collections; using Syst ...
- 2基本类型数组和枚举类型——重拾Java
2.1 标识符和关键字 2.1.1标识符 标识符:用来标志类名.变量名.方法名.类型名.数组名.文件名的有效字符序列称为标识符.简单地说,标识符就是一个名字. Java关于标识符的语法规则 标识符由字 ...
- Spring的controller接受Date类型数据,接受枚举类型数据
1. Controller接收Date类型的数据 核心使用@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 来将传递过来的时间字符串 ...
- java 枚举类型知识点记录
在日常开发中,我们常用接口装常量或者在类里面写静态常量,java1.5以后加入了枚举类型enum.枚举类型是由一组固定的常量组成的类型.枚举本质是int值.因为枚举类型没有可以访问的构造器,所以枚举类 ...
- 【C#进阶系列】15 枚举类型和位标志
实际上本章就只讲枚举类型,因为位标志本来就可以当做一个特殊的枚举类型. 关于枚举类型 枚举类型是一种消灭魔法数字的好方法,使程序更容易编写,阅读和维护. 枚举类型是值类型,然而有别于其它值类型,枚举类 ...
- C#语言基础——结构体和枚举类型
结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...
- C#枚举类型和结构体
注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...
- C#_枚举类型
C#中的枚举是名/值对的数据类型,下面是自定义的军衔等级的枚举 //定义枚举 enum MilitaryRank { Commander, ArmyCorpCommander, Military ...
随机推荐
- VS2019 开发Django(一)------环境配置
导航:VS2019开发Django系列 缘起:学习是我一直在做的一件事情,但是,可怕的是不知道学习什么,然后止步不前,安于现状,曾经很长的一段时间,我是不知道学习什么,工作上的事情,其实是相对固定的, ...
- 【每天一题】LeetCode 0067. 二进制求和
开源地址:https://github.com/jiauzhang/algorithms 题目描述 * https://leetcode-cn.com/problems/add-binary * 给定 ...
- 【代码审计】ESPCMSP8(易思企业建站管理系统)漏洞报告
0x00简介 项目名称:ESPCMS-P8(易思企业建站管理系统) 测试平台:Windwos 版本信息:P8.19082801稳定版 更新时间:2019-08-30 00:56:32 网站官网:htt ...
- java月考题JSD1908第二次月考(含答案和解析)
考试 .container { clear: both; margin: 0 auto; text-align: left; /*width: 1200px;*/ } .container:after ...
- CodeForces - 158C(模拟)
题意 https://vjudge.net/problem/CodeForces-158C 你需要实现类似 Unix / Linux 下的 cd 和 pwd 命令. 一开始,用户处于根目录 / 下. ...
- 【ftp服务】配置ftp用户不能返回上级目录,只能在指定的目录
500 OOPS: vsftpd: both local and anonymous access disabled! 出现这个错,需要修改配置:local_enable=YES 500 OOPS: ...
- C#/.Net开发入门篇(3)——console类的输入输出
相信看了我上一篇文章的小伙伴们都知道console这个类的最基本的2个方法了吧,下去练习过的小伙伴应该能知道4个方法. 那么下面我们就来介绍一下上期没有介绍完的另外2个方法Console.WriteL ...
- PlayJava Day024
造型Cast补充: 子类的对象可以赋值给父类的变量 注意:Java中不存在对象对对象的赋值 父类的对象不能赋值给子类的变量 例: Vechicle v ; Car c = new Car() ; v ...
- JavaWeb入门——在Linux环境下安装Tomcat服务器
JavaWeb入门——在Linux环境下安装Tomcat服务器 摘要:本文主要学习了如何在Linux环境下安装Tomcat服务器. 准备工作 检查Java环境变量 检查系统是否配置了Java的环境变量 ...
- Android 程序分析环境搭建-静态分析环境搭建
1.2 静态分析环境搭建 这里主要讲一些用的比较顺手的工具,一并列出来,Uaa,等环境配置, 2,notepad++ ,everything , Jdgui ,idea, ida ,Fiddler , ...