Golang模拟枚举

84 篇文章 3 订阅

我们知道,go语言不支持枚举类型
枚举的表示:
C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。
具体标准:

  1. 列出所有可能出现的值
  2. 取值不能超过定义的范围
    我上网搜了关于go的模拟枚举,但是只有第一个效果,没有第二个效果(也可能我没有发现相关的文章),但是想要做出来第二种效果,其实也不难

首先想到的,自定义数据类型(失败)
先说失败原因:用户可以通过接口自定义变量或常量,使第二个功能失效

package enum
type SourceValue int
const(
	Source_Pc SourceValue=1
	Source_And SourceValue=2
)
func Test(e SourceValue){//当外包调用时,传参只能为SourceValue类型参数
//但是,这种情况下,当外包调用函数,并传参,传一个int值时,仍然可以,因为底层就是int型
	fmt.Println(e)
}

第二种传入接口值(失败)
失败原因:声明接口的接口名开头的字母大写之后,包外仍可以访问,在包外可以声明自定义的变量或常量,使第二个功能失效

package enum
type SourceValue int//定义数据类型
type safe interface{//定义接口,需要注意,定义的接口只能包内访问到
//如果外包访问到,则用户自己实现接口,则可以传入自定义值。不能实现参数有取值范围
	safemethod()
}
const(//定义常量,大写,如果小写外包访问不到
	Source_Pc SourceValue=1
	Source_And SourceValue=2
)
func (a SourceValue)safemethod(){//实现接口
	return
}
func Test(v safe){//只能传入实现此接口的变量值类型
	fmt.Println(v)
}

第二种传结构类型值(有效)
注意声明的接口,只能为小写,如果接口名首字母为大写,包外就可以访问到,仍然可以自定义常量或变量,使第二种功能失效

package enum
type sourceValue int//定义数据类型
type safe interface{//定义接口,需要注意,定义的接口只能包内访问到
//如果外包访问到,则用户自己实现接口,则可以传入自定义值。不能实现参数有取值范围
	safemethod()
}
const(//定义常量,大写,如果小写外包访问不到
	Source_Pc sourceValue=1
	Source_And sourceValue=2
)
func (a sourceValue)safemethod(){//实现接口
	return
}
func Test(v safe){//只能传入实现此接口的变量值类型
	fmt.Println(v)
}

此时,如果用户调用该函数,则只能使用定义好的常量,不能自定义参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值