今天使用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 自定义类型来实现枚举类型限制的更多相关文章

  1. 基于自定义Validator来验证枚举类型

    基于自定义Validator来验证枚举类型 一.背景 二.技术要点 三.实现一个自定义枚举校验. 1.需求. 2.实现步骤 1.自定义一个 Sex 枚举. 2.自定义一个 Enum 注解 3.编写具体 ...

  2. 实现自定义集合的可枚举类型(IEnumerable)和枚举数(IEnumerator )

    下面的代码示例演示如何实现自定义集合的 IEnumerable 和 IEnumerator 接口: using System; using System.Collections; using Syst ...

  3. 2基本类型数组和枚举类型——重拾Java

    2.1 标识符和关键字 2.1.1标识符 标识符:用来标志类名.变量名.方法名.类型名.数组名.文件名的有效字符序列称为标识符.简单地说,标识符就是一个名字. Java关于标识符的语法规则 标识符由字 ...

  4. Spring的controller接受Date类型数据,接受枚举类型数据

    1. Controller接收Date类型的数据 核心使用@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 来将传递过来的时间字符串 ...

  5. java 枚举类型知识点记录

    在日常开发中,我们常用接口装常量或者在类里面写静态常量,java1.5以后加入了枚举类型enum.枚举类型是由一组固定的常量组成的类型.枚举本质是int值.因为枚举类型没有可以访问的构造器,所以枚举类 ...

  6. 【C#进阶系列】15 枚举类型和位标志

    实际上本章就只讲枚举类型,因为位标志本来就可以当做一个特殊的枚举类型. 关于枚举类型 枚举类型是一种消灭魔法数字的好方法,使程序更容易编写,阅读和维护. 枚举类型是值类型,然而有别于其它值类型,枚举类 ...

  7. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  8. C#枚举类型和结构体

    注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...

  9. C#_枚举类型

     C#中的枚举是名/值对的数据类型,下面是自定义的军衔等级的枚举 //定义枚举 enum MilitaryRank { Commander, ArmyCorpCommander, Military ...

随机推荐

  1. Homebrew的安装

    Homebrew是一款Mac OS平台下的软件包管理工具. 安装方法:命令行输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserc ...

  2. day 28-1 元类

    元类 元类的用途:自定义元类控制类的创建行为及类的实例化行为 Python 中一切皆为对象. 一切接对象,对象可以怎么用呢? 1.都可以被引用,x=obj 2.都可以当作函数的参数传入 3.都可以当作 ...

  3. Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

    1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation. ...

  4. Springboot整合redis步骤

    一.加入依赖 <dependency> <groupId>com.github.spt-oss</groupId> <artifactId>spring ...

  5. docker快速安装rabbitmq

    1.进入docker hub镜像仓库地址:https://hub.docker.com/ 2.搜索rabbitMq,进入官方的镜像,可以看到以下几种类型的镜像:我们选择带有“mangement”的版本 ...

  6. 我用 Python 破解了同事的加密压缩包!

    ​ 作者 | 朱小五 又是一杯奶茶. 事情的经过是这样的: ​ ​ 又是奶茶,行吧快点开工,争取李大伟回来之前搞定 李大伟说是6位数字密码 那么我们可以利用python生成全部的六位数字密码 #生成从 ...

  7. 从零开始手写 dubbo rpc 框架

    rpc rpc 是基于 netty 实现的 java rpc 框架,类似于 dubbo. 主要用于个人学习,由渐入深,理解 rpc 的底层实现原理. 前言 工作至今,接触 rpc 框架已经有很长时间. ...

  8. Python高级特性——迭代(Iteration)

    1.给定一个集合list或者tuple,可以通过for …… in ……的语法来实现循环遍历,这个循环我们就叫做迭代 迭代list: >>> m = ['haha','hehe',' ...

  9. LATEX Mathematical Symbols

    原文地址:https://www.caam.rice.edu/~heinken/latex/symbols.pdf

  10. Android 项目优化(二):启动页面优化

    一.启动页黑屏的问题 1.1 问题现象描述 Android App 启动页面黑屏的问题,现象表现为:Android 开发 App 启动时若没有做特殊处理的话,会出现一瞬间的白屏现象.即使启动页界面就加 ...