栏目分类
你的位置:国色天香在线观看全集免费播放 > 无码精品久久久天天影视 > 无码精品久久久天天影视
Go 言语里怎样正确杀青陈设?谜底藏着官方的源码里
发布日期:2022-06-18 17:03 点击次数:170
本文转载自微信公众号「网管叨bi叨」,作家网管。转载本文请关联网管叨bi叨公众号。
在编程限制里,陈设是用来暗意只包含有限数目的固定值的类型,在配置中一般用于记号失实码约略景色机。拿一个实体对象的景色机来说,它平方与这个对象在数据库里对应纪录的记号景色的字段值相对应。
在刚启动学编程的时期,你一定写过,至稀有过平直使用魔术数字进行判断的代码。啥叫魔术数字呢,举个例子,要置顶一个著述的时期先判断著述是不是已发布景色。
if (article.state == 2) { // state 2 代表著述已发布 }
假如我们的代码里莫得防备,约略等我们相貌标代码里充斥着这些魔术数字的判断的时期,你是不是会很头疼?
自后我就学会了把这些景色值界说成常量,况且也搞一个判断对象景色的措施单独封装这段逻辑。
public class ArticleState { public static final int Draft = 1; //草稿 public static final int Published = 2; //发布 public static final int Deleted = 3; // 已删除 } public Boolean checkArticleState(int state) { ... }
这种用法,确定是比在法子里平直用魔术数字进行判断要强好多啦,至少看着不会很头疼,不会想骂**。
不事自后被其时带我的老老迈说这种也有症结,上头这个 checkArticleState 措施用来查验著述景色, a级毛片免费观看在线播放本意是让调用者传入 ArticleState 的三个静态常量之一,但由于莫得类型上的敛迹,因此传入恣意一个 int 值在语法上亦然允许的,编译器也不会提倡任何劝诫,换成用陈设更允洽一些。
em~! 我不谨记大学教 Java 的阿谁学期真挚讲过这玩意啊,莫非又是一个上课玩手机错过的常识点?......
是以使用陈设后我们的Java代码变成了:
// 使用enum而非class声明 public enum ArticleState { //要在enum里创建通盘的陈设对象 Draft(1, "草稿"); Published(2, "已发布"); Deleted(3,无码精品久久久天天影视 "已删除") // 自界说属性 private int code; private String text; // 构造措施必须是private的 ArticleState(int code, String text) { this.code = id; this.text = name; } } public Boolean checkArticleState(ArticleState state) { ... }
这样就能靠形参的陈设类型帮我们过滤掉违警的景色值。把整型值当作参数传给 checkArticleState 措施时因为类型不匹配编译不外去,在写代码时编译器也能连忙指示出来。
淌若没灵验过 Java 的小伙伴也不必纠结,主要的语法点我用防备标注出来了。
自后这两年主要在用Go做相貌,我发现相似的问题 Go 里也存在,然则 Go 并莫得提供陈设类型,那怎样做到进事业态值的正确松手呢?淌若也曾用 int 型的常量确定不行。比如:
const ( Draft int = 1 Published = 2 Deleted = 3 ) const ( Summer int = 1 Autumn = 2 Winter = 3 Spring = 4 ) func main() { // 输出 true, 不会有任何编译失实 fmt.Println(Autumn == Draft) }
比如上头界说了两组 int 类型的常量,一类代表著述景色,一类代表季节的四季。这种相貌拿著述景色与季节进行比拟不会有任何编译上的失实。
谜底在 Go 内置库约略一些我们都走漏的开源库的代码里就能找到。比如望望 google.golang.org/grpc/codes 里的gRPC 的失实码是怎样界说的,我们连忙就能显豁该怎样正确的杀青陈设。
底下未几卖关子平直上谜底了,不想去源码里看的,就看我这里写的也行,都是这样做的。
我们不错用 int 当作基础类型创建一个笔名类型,Go 里边是救济这个的
type Season int const ( Summer Season = 1 Autumn = 2 Winter = 3 Spring = 4 )
天然界说相连的常量值的时期 Go 里边时常使用 iota,是以上头的界说还能进一步简化。
type Season int const ( Summer Season = iota + 1 Autumn Winter Spring ) type ArticleState int const ( Draft ArticleState = iota + 1 Published Deleted ) func checkArticleState(ArticleState state) { // ... } func main() { // 两个操作数类型不匹配,编译失实 fmt.Println(Autumn == Draft) // 参数类型不匹配,编译失实 checkArticleState(100) }
天然这些景色值的底层的类型都是 int 值,然则目下无论是进行两个不联系类型的陈设值比拟,也曾用整型值当作参数调用 checkArticleState 措施查验著述景色,都会形成编译失实,因为目下我们使用景色值的所在都有了类型松手。
这即是为什么针对失实码、景色机这种波及有限数目景色值的场景下不可用整型常量而是要用陈设的原因。天然 Go 言语里莫得像 Java 相同单独提供一个 enum 暗意陈设的类型,然则我们仍然能通过创建类型笔名来杀青陈设。
你学会了吗?(#^.^#)