ホームページ バックエンド開発 Golang 基本的な Golang - 同等性の比較

基本的な Golang - 同等性の比較

Nov 01, 2024 am 12:28 AM

Golang básico - Comparação de Igualdade

この投稿は、GoLang での開発に必要な基本を共有するシリーズの一部です。

== または != 演算子を使用した論理比較には、それほど謎はありません。または、コードは値が同じか異なるかを比較します。
ただし、比較対象について知っておくべき重要な詳細がいくつかあります。

同等のインターフェース

最初に、これらの演算子で何が比較できるのかを知る必要があります。これを知るための最も明白な場所は、Go ドキュメントのコンパレーターに関するセクションです

もう 1 つのオプションは、Go のジェネリックス実装とともに追加された同等のインターフェイスを調べることです。このインターフェイスを実装するすべての型は同等です。

したがって、基本的に Go で定義されたすべてのプリミティブ型 (文字列、数値 (int、float、complex)、bool など) は比較可能です。

複合型の比較

一部の型には、比較できるかどうかの条件があります。これは、構造体、スライス、チャネルの場合です。
要素も比較可能な場合にのみ比較可能です。
興味深いのは、Go がコンパイル レベルでこれを検証し、実行時エラーを回避できることです。次に例を示します。

//Esse código compila e a comparação funciona:
func main() {
    test1 := struct {
        name       string
    }{}
    test2 := struct {
        name       string
    }{}
    if test1 == test2 {
        fmt.Println("Funciona")
    }
}
ログイン後にコピー

上記のコードでは、同等の属性を持つ 2 つの構造体を作成しており、比較は機能します。

//Esse código não compila
func main() {
    test1 := struct {
        name       string
        attributes map[string]string
    }{}
    test2 := struct {
        name       string
        attributes map[string]string
    }{}
    if test1 == test2 {
        fmt.Println("Cade?")
    }
}
ログイン後にコピー

このコードは、無効な操作エラーによりコンパイルに失敗します。

これは、Go ではマップが同等の型ではないために発生します。

構造体とマップの詳細

構造体を == で比較できると非常に便利です。これらの型はモデリングをカスタマイズするためです。
ただし、比較不可能な型を使用する場合でも、コードを簡素化する方法がいくつかあり、これを知っていれば、本当に退屈な条件を記述する必要がなくなります。

それでは、学校システムで作業していて、次のような比較できない構造体があると想像してみましょう:

type student struct {
    ID         int
    name       string
    age        int
    course     string
    attributes map[string]string
}
ログイン後にコピー

良い点は、この構造体には ID フィールドがあるため、永続化されたデータを扱う場合が非常に簡単になります。

ここで、まだ一時的なデータを操作している場合を想像してみてください。たとえば、ファイルを読み取っていて、このデータを永続化する前に何らかの処理を行う必要がある場合です。

フィールドごとに比較するオプションが常にあり、まったく便利ではありませんが、機能します。ただし、次のように構造体の構成を利用できます:

func main() {
    type identity struct {
        name   string
        age    int
        course string
    }
    type student struct {
        ID int
        identity
        attributes map[string]string
    }

    s1 := student{
        identity: identity{
            name:   "Chuck",
            age:    10,
            course: "golang",
        },
        attributes: map[string]string{
            "last_score": "10",
        },
    }
    s2 := student{
        identity: identity{
            name:   "Chuck",
            age:    10,
            course: "golang",
        },
        attributes: map[string]string{
            "last_score": "20",
        },
    }

    s3 := student{
        identity: identity{
            name:   "Chuck",
            age:    12,
            course: "golang",
        },
        attributes: map[string]string{
            "last_score": "20",
        },
    }

    if s1.identity == s2.identity {
        fmt.Println("Achou", s1)
    }

    if s1.identity != s3.identity {
        fmt.Println("Não achou")
    }
}

ログイン後にコピー

このコードの代わりに、次のような条件を作成することもできます。

    if s1.name == s2.name && s1.age == s2.age && s1.course == s2.course {
        fmt.Println("Achou", s1)
    }
ログイン後にコピー

混乱を避けるためにこれを関数に抽出することもできますが、それでもこれらの比較を維持する必要があります。

コンポジションを上手に活用すると、コードが大幅に簡素化されます。

まとめ

  • 同等のインターフェースについて学ぶ
  • プリミティブ型は同等です
  • 複合型は比較できる場合とそうでない場合があります
  • 構図を有効に活用してください。

以上が基本的な Golang - 同等性の比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか?

See all articles