我们知道,go语言不支持枚举类型
枚举的表示:
C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。
具体标准:
- 列出所有可能出现的值
- 取值不能超过定义的范围
我上网搜了关于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)
}
此时,如果用户调用该函数,则只能使用定义好的常量,不能自定义参数。