まえがき
列挙型は、
java
、C
言語および言語において非常に重要なデータ型です。他の主流のプログラミング言語は列挙型をサポートしていますが、Go 言語には列挙型がありません。この記事では、この問題について説明します。
列挙型が必要な理由
java
言語を例に挙げます。 , inJDK1.5
以前は列挙型はありませんでした。通常、列挙を表すには int
定数を使用します。一般的な使用法は次のとおりです:
public static final int COLOR_RED = 1; public static final int COLOR_BLUE = 2; public static final int COLOR_GREEN = 3;
Use int
型には次のような隠れた危険性がある可能性があります:
不具备安全性,声明时如果没有使用 final
就会造成值被篡改的风险;语义不够明确,打印 int
型数字并不知道其具体含义
于是乎我们就想到用常量字符来表示,代码就变成了这样:
public static final String COLOR_RED = "RED"; public static final String COLOR_BLUE = "BLUE"; public static final String COLOR_GREEN = "GREEN";
这样也同样存在问题,因为我们使用的常量字符,那么有些程序猿不按套路出牌就可以使用字符串的值进行比较,这样的代码会被不断模仿变得越来越多的,然后山就出现了;
所以我们迫切需要枚举类型的出现来起到约束的作用,假设使用一个枚举类型做入参,枚举类型就可以限定沙雕用户不按套路传参,这样就可以怼他了,哈哈~;
使用枚举的代码就可以变成这样,传了枚举之外的类型都不可以了;
public class EnumClass { public static void main(String [] args){ Color color = Color.RED; convert(color); System.out.println(color.name()); } public static void convert(Color c){ System.out.println(c.name()); } } enum Color{ RED,BLUE,GREEN; }
Go语言就没有枚举类型,我们该使用什么方法来替代呢?
定义新类型实现枚举
枚举通常是一组相关的常量集合,Go
语言中有提供常量类型,所以我们可以使用常量来声明枚举,但也同样会遇到上述的问题,起不到约束的作用,所以为了起到约束我们可以使用Go
语言另外一个知识点 -- 类型定义,Go
语言中可以使用type
关键字定义不同的类型,我们可以为整型、浮点型、字符型等定义新的类型,新的类型与原类型转换需要显式转换,这样在一定程度上也起到了约束的作用,我们就可以用Go
语言实现如下枚举:
type OrderStatus int const ( CREATE OrderStatus = iota + 1 PAID DELIVERING COMPLETED CANCELLED ) func main() { a := 100 IsCreated(a) }
上面的代码就会报错:
./main.go:19:12: cannot use a (variable of type int) as type OrderStatus in argument to IsCreated
定义新的类型可以起到约束作用,比如我们要检查状态机,入参限定了必须是OrderStatus类型,如果是int
类型就会报错。
上面我们的枚举实现方式只能获取枚举值,获取不到其映射的字面意思,所以我们可以优化一下,实现String
方法,使用官方提供的cmd/string来快速实现,代码如下:
//go:generate stringer -type=OrderStatus type OrderStatus int const ( CREATE OrderStatus = iota + 1 PAID DELIVERING COMPLETED CANCELLED )
执行命令go generate ./...
生成orderstatus_string.go文件:
import "strconv" func _() { // An "invalid array index" compiler error signifies that the constant values have changed. // Re-run the stringer command to generate them again. var x [1]struct{} _ = x[CREATE-1] _ = x[PAID-2] _ = x[DELIVERING-3] _ = x[COMPLETED-4] _ = x[CANCELLED-5] } const _OrderStatus_name = "CREATEPAIDDELIVERINGCOMPLETEDCANCELLED" var _OrderStatus_index = [...]uint8{0, 6, 10, 20, 29, 38} func (i OrderStatus) String() string { i -= 1 if i < 0 || i >= OrderStatus(len(_OrderStatus_index)-1) { return "OrderStatus(" + strconv.FormatInt(int64(i+1), 10) + ")" } return _OrderStatus_name[_OrderStatus_index[i]:_OrderStatus_index[i+1]] }
protobuf中生成的枚举代码
Go
语言使用protobuf会生成对应的枚举代码,我们发现其中也是使用定义新的类型的方式来实现的,然后在封装一些方法,我们来赏析一下protobuf生成的枚举代码:
const ( CREATED OrderStatus = 1 PAID OrderStatus = 2 CANCELED OrderStatus = 3 ) var OrderStatus_name = map[int32]string{ 1: "CREATED", 2: "PAID", 3: "CANCELED", } var OrderStatus_value = map[string]int32{ "CREATED": 1, "PAID": 2, "CANCELED": 3, } func (x OrderStatus) Enum() *OrderStatus { p := new(OrderStatus) *p = x return p } func (x OrderStatus) String() string { return proto.EnumName(OrderStatus_name, int32(x)) } func (x *OrderStatus) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(OrderStatus_value, data, "OrderStatus") if err != nil { return err } *x = OrderStatus(value) return nil }
总结
虽然Go语言没有提供枚举类型,但是我们也可以根据Go
语言的两个特性:常量和定义新类型来实现枚举,方法总比困难多吗,开源库是优秀的,我们往往可以从高手那里里学习很多,记住,请永远保持一个学徒之心;
以上が皆さん、Go プロジェクトで列挙型をどのように使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

Golangは実際のアプリケーションに優れており、そのシンプルさ、効率性、並行性で知られています。 1)同時プログラミングはゴルチンとチャネルを通じて実装されます。2)柔軟なコードは、インターフェイスと多型を使用して記述されます。3)ネット/HTTPパッケージを使用したネットワークプログラミングを簡素化、4)効率的な同時クローラーを構築する、5)ツールと最高の実践を通じてデバッグと最適化。

GOのコア機能には、ガベージコレクション、静的リンク、並行性サポートが含まれます。 1. GO言語の並行性モデルは、GoroutineとChannelを通じて効率的な同時プログラミングを実現します。 2.インターフェイスと多型は、インターフェイスメソッドを介して実装されているため、異なるタイプを統一された方法で処理できます。 3.基本的な使用法は、関数定義と呼び出しの効率を示しています。 4。高度な使用法では、スライスは動的なサイズ変更の強力な機能を提供します。 5.人種条件などの一般的なエラーは、Getest Raceを通じて検出および解決できます。 6.パフォーマンス最適化Sync.Poolを通じてオブジェクトを再利用して、ゴミ収集圧力を軽減します。

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

SQLクエリの結果の並べ替えについて混乱しています。 SQLを学習する過程で、しばしば混乱する問題に遭遇します。最近、著者は「Mick-SQL Basics」を読んでいます...

テクノロジースタックの収束とテクノロジーの選択の関係ソフトウェア開発におけるテクノロジーの選択、テクノロジースタックの選択と管理は非常に重要な問題です。最近、一部の読者が提案しています...

ゴーラン...

GO言語で3つの構造を比較および処理する方法。 GOプログラミングでは、2つの構造の違いを比較し、これらの違いを...


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

メモ帳++7.3.1
使いやすく無料のコードエディター

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター
