ホームページ >よくある問題 >golang の列挙とはどういう意味ですか?

golang の列挙とはどういう意味ですか?

DDD
DDDオリジナル
2023-06-06 11:53:261077ブラウズ

Golang 列挙は、一連のキーと値のペアで構成される重要なデータ型です。通常、プログラミング言語の定数識別子として使用されます。C、Java などの主要な人気のあるプログラミング言語で使用されます。 ., ネイティブ サポートがあります。プログラミングの分野では、列挙型は限られた数の固定値のみを含む型を表すために使用されます。列挙型は通常、開発でエラー コードやステート マシンを識別するために使用されます。

golang の列挙とはどういう意味ですか?

この記事の動作環境: Windows 10 システム、go1.20 バージョン、dell g3 コンピューター。

列挙型は、一連のキーと値のペアで構成される重要なデータ型であり、通常はプログラミング言語の定数の識別子として使用されます。 C、Java などの主要な一般的なプログラミング言語はすべてネイティブ サポートを備えています。 Go では、列挙型を宣言するために直接使用される enum やその他のキーワードは見つかりません。他のプログラミング言語に精通しており、Go プログラミングに切り替える開発者にとって、最初はこの状況を受け入れるのはさらに難しいでしょう。実際、Go で列挙型がどのように表現されているかを見ると、Go 言語の設計者が、一般の若手エンジニアには真似できないほど、簡潔さと問題点を深く考慮していると感じるかもしれません。プログラミングの分野では、列挙型は限られた数の固定値のみを含む型を表すために使用され、通常、開発時にエラー コードやステート マシンを識別するために使用されます。

実際、Go 言語設計者の目には enum は本質的に定数ですが、なぜ余分なキーワードがあるのでしょうか? go には enum キーワードがないだけで、列挙型を表現する方法は他の言語とあまり変わりません。 Go で列挙型を表現する方法を見てみましょう。

言語を学び、使うということは、その言語そのものの設計思想を学び理解することであり、同時に設計者の個性も感じられることになります。

基本的な作業

以降の説明の便宜上、ここではまず go モジュールを使用して簡単なプロジェクトを作成します。

~/Projects/go/examples  
➜  mkdir enum  
~/Projects/go/examples  
➜  cd enum  
~/Projects/go/examples/enum  
➜  go mod init enum  
go: creating new go.mod: module enum  
~/Projects/go/examples/enum  
➜  touch enum.go

const iota

開始、実行、停止の 3 つの状態を例として、const キーを使用して一連の定数値を宣言します。 enum.go に次の内容を記述します。

package main  
import "fmt"  
const (  
    Running int = iota  
    Pending  
    Stopped  
)  
func main() {  
    fmt.Println("State running: ", Running)  
    fmt.Println("State pending: ", Pending)  
    fmt.Println("State Stoped: ", Stopped)  
}

保存して実行すると、次の結果が得られます。

~/Projects/go/examples/enum   
➜  go run enum.go  
State running:  0  
State pending:  1  
State Stoped:  2

は、前に何が起こったかを説明します。 、イオタについて一つ見てみましょう。 C や Java と比較して、Go は定数カウンター iota を提供します。これは、定数の宣言時に定数への値の継続的な代入を使用します。

たとえば、この例では、

const (  
    a int = iota // a = 0  
    b int = iota // b = 1  
    c int = iota // c = 2  
)  
const d int = iota // d = 0

const 宣言ブロックでは、iota の初期値は 0 であり、変数が宣言されるたびに増加します。 1までに。上記のコードは次のように簡略化できます。

const (  
    a int = iota // a = 0  
    b // b = 1  
    c // c = 2  
)  
const d int = iota // d = 0

この時点で 50 または 100 の定数があり、C 言語と Java 言語で記述された場合に何が起こるかを想像してください。

iotaに関しては、さらに具体的な手法(ホップ数など)があるので、詳しくはiotaの公式定義を参照してください。

const を使用して一連の定数を定義し、iota 定数カウンターを使用して数値型定数に値を迅速かつ連続的に割り当てると非常に便利です。 enum キーワードはありませんが、この場合は冗長であることがわかります。列挙は基本的に定数の組み合わせです。

もちろん、次のメソッドを使用して他の言語の列挙型に近づけることもできます。

// enum.go  
...  
type State int  
const (  
    Running State = iota  
    Pending  
    Stopped  
)  
...

定数値のセットを型でラップするエイリアスですよね? 他の言語で定義されている enum {} に似ていますか?

上記の例を次のように変更することもできます。

// enum.go  
...  
type State int 
const (  
    Running State = iota  
    Pending  
    Stopped  
)  
func (s State) String() string {  
    switch s {  
    case Running:  
        return "Running"  
    case Pending:  
        return "Pending"  
    case Stopped:  
        return "Stopped"  
    default:  
        return "Unknown" 
     }  
}  
...

定義された列挙型に String 関数を追加すると、実行結果は次のようになります。

~/Projects/go/examples/enum   
➜  go run enum.go  
State running:  Running  
State pending:  Pending  
State Stoped:  Stopped

魔法ですよね? 思考の幅も広がり、たくさんの経験が積めました。印刷された文字から実際の値を分離することは、ほとんどの言語設計者が思いつかないことです。これを見て、このように感じませんか? Go 言語の設計者は怠け者ではありませんが、怠けるために多くのことを考え、多くのことを行ってきました。

以上がgolang の列挙とはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。