网络技术

你的位置:【欧冠体育竞猜 手机网页登陆】 > 网络技术 > Go 言语里怎么准确凿现罗列?答案藏着平易近间的源码里


Go 言语里怎么准确凿现罗列?答案藏着平易近间的源码里

发布日期:2022-08-06 16:17    点击次数:154

本文转载自微信群众号「网管叨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 编制用来查抄文章形态,本意是让调用者传入 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 (     Su妹妹er int = 1     Autumn     = 2     Winter     = 3     Spring     = 4 )  func main() {     // 输出 true, 不会有任何编译舛误     fmt.Println(Autumn == Draft) } 

比喻上面定义了两组 int 范例的常量,一类代表文章形态,一类代表时节的四季。这类编制拿文章形态与时节举行相比不会有任何编译上的舛误。

答案在 Go 内置库或许一些咱们都晓得的开源库的代码里便可以或许找到。比喻看看 谷歌.golang.org/grpc/codes 里的gRPC 的舛误码是怎么定义的,咱们当即便可以或许显然该怎么准确的完成罗列。

上面不多卖关子间接上答案了,不想去源码里看的,就看我这里写的也行,都是这么做的。

咱们可以或许用 int 作为底子范例创立一个又名范例,Go 里边是支持这个的

type Season int  const (  Su妹妹er Season = 1  Autumn        = 2  Winter        = 3  Spring        = 4 ) 

固然定义间断的常量值的岁月 Go 里边常常运用 iota,所以上面的定义还能进一步简化。

type Season int  const (  Su妹妹er 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 默示罗列的范例,然则咱们仍然能经由过程创立范例又名来完成罗列。

 

你学会了吗?(#^.^#)

 



上一篇:Sentry 开发者贡献指南
下一篇:母亲90光阴寿恭喜辞