目次
Go におけるジェネリックの代替手段
インターフェイス
型アサーション
コード生成
リフレクション
ホームページ バックエンド開発 Golang golang のジェネリックの代替手段は何ですか?

golang のジェネリックの代替手段は何ですか?

May 03, 2024 pm 01:51 PM
git golang ジェネリック

Go にはジェネリックの代替手段がいくつかあります。1. インターフェイス: メソッド セットの定義が可能で、同じインターフェイスを実装することで異なる型でも同じ動作を実現できます。2. 型アサーション: 実行時に型を確認します。 3. コード生成: コンパイル時に型に基づいて効率的なコードを生成します。 4. リフレクション: 実行時に型をチェックして操作し、型指定されたコードを動的に作成して呼び出してジェネリックを実装できます。行動。

golang のジェネリックの代替手段は何ですか?

Go におけるジェネリックの代替手段

Go 言語は静的に型付けされた言語であり、従来のジェネリックのサポートには一定の制限があります。ただし、ジェネリックのような機能を実現するための代替手段がいくつかあります。

インターフェイス

インターフェイスは、特定の種類のデータを指定せずに一連のメソッドを定義できるようにするタイプ セーフティ メカニズムです。インターフェイスを実装することで、同じ動作を持つ異なる型を作成できます。

type Sortable interface {
    Less(other Sortable) bool
}

type IntSorter struct {
    ints []int
}

func (s IntSorter) Less(other Sortable) bool {
    return s.ints[0] < other.(IntSorter).ints[0]
}

type StringSorter struct {
    strings []string
}

func (s StringSorter) Less(other Sortable) bool {
    return s.strings[0] < other.(StringSorter).strings[0]
}
ログイン後にコピー

この方法により、型の安全性を維持しながら、同じ並べ替え動作を持つ IntSorter 型と StringSorter 型を作成できます。

型アサーション

型アサーションを使用すると、実行時に型のチェックとキャストが可能になります。これを使用して値を検出および変換し、ジェネリックのような動作を可能にします。

func SortAnything(data interface{}) {
    switch v := data.(type) {
    case []int:
        sort.Ints(v)
    case []string:
        sort.Strings(v)
    default:
        panic("Unsupported type")
    }
}
ログイン後にコピー

型アサーションを使用すると、さまざまな型のデータを処理できますが、型チェックのオーバーヘッドと潜在的な実行時エラーに注意する必要があります。

コード生成

コード生成は、型指定されたコードを生成することによって一般的な動作を作成する手法です。これはコンパイル時に実行でき、特定のタイプの効率的なコードが得られます。

import "github.com/dave/jennifer/jen"

func GenerateSorter(t string) string {
    code := jen.NewFile("sorter")
    code.Func().Id("Sort" + t).Params(jen.Id("data").Index().Id(t)).BlockFunc(func(g *jen.Group) {
        g.Sort().Id(t).Call(jen.Id("data"))
    })
    return code.GoString()
}

func main() {
    intSorter := GenerateSorter("int")
    stringSorter := GenerateSorter("string")
    fmt.Println(intSorter)
}
ログイン後にコピー

コード生成を通じて、特定の型を対象とする効率的な並べ替え関数を動的に生成できます。

リフレクション

リフレクションを使用すると、プログラムは実行時に型を検査して操作できます。これを使用して、型指定されたコードを動的に作成および呼び出して、ジェネリックのような動作を実現できます。

func SortAnythingReflect(data interface{}) {
    t := reflect.TypeOf(data)
    if t.Kind() != reflect.Slice {
        panic("Unsupported type")
    }
    v := reflect.ValueOf(data)
    sort := reflect.MakeFunc(t.Method(by("Less")).Type(),
        func(args []reflect.Value) []reflect.Value {
            a := args[0].Interface()
            b := args[1].Interface()
            if a.(Comparable).Less(b) {
                return []reflect.Value{reflect.ValueOf(true)}
            }
            return []reflect.Value{reflect.ValueOf(false)}
        })
    sort.Call([]reflect.Value{v, v})
}
ログイン後にコピー

リフレクションは、一般的な動作を実装するための非常に柔軟な方法を提供しますが、他の代替手段よりも高価であり、コードが読みにくく保守しにくい場合があります。

以上がgolang のジェネリックの代替手段は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Jun 06, 2024 pm 05:14 PM

Go ではファイルを安全に読み書きすることが重要です。ガイドラインには以下が含まれます。 ファイル権限の確認 遅延を使用してファイルを閉じる ファイル パスの検証 コンテキスト タイムアウトの使用 これらのガイドラインに従うことで、データのセキュリティとアプリケーションの堅牢性が確保されます。

DeepSeekをインストールする方法 DeepSeekをインストールする方法 Feb 19, 2025 pm 05:48 PM

DeepSeekをインストールするには、Dockerコンテナ(最も便利な場合は、互換性について心配する必要はありません)を使用して、事前コンパイルパッケージ(Windowsユーザー向け)を使用してソースからコンパイル(経験豊富な開発者向け)を含む多くの方法があります。公式文書は慎重に文書化され、不必要なトラブルを避けるために完全に準備します。

DeepSeek使用のためのFAQの概要 DeepSeek使用のためのFAQの概要 Feb 19, 2025 pm 03:45 PM

Deepseekai ToolユーザーガイドとFAQ Deepseekは、強力なAIインテリジェントツールです。 FAQ:異なるアクセス方法の違い:Webバージョン、アプリバージョン、API呼び出しの間に機能に違いはありません。アプリは、Webバージョンのラッパーにすぎません。ローカル展開は蒸留モデルを使用します。これは、DeepSeek-R1のフルバージョンよりもわずかに劣っていますが、32ビットモデルには理論的には90%のフルバージョン機能があります。居酒屋とは何ですか? Sillytavernは、APIまたはOllamaを介してAIモデルを呼び出す必要があるフロントエンドインターフェイスです。壊れた制限とは何ですか

LBank Exchange に登録するにはどうすればよいですか? LBank Exchange に登録するにはどうすればよいですか? Aug 21, 2024 pm 02:20 PM

LBank に登録するには、公式 Web サイトにアクセスし、「登録」をクリックします。メールアドレスとパスワードを入力し、メールアドレスを確認します。 LBank アプリをダウンロード iOS: AppStore で「LBank」を検索します。 「LBank-DigitalAssetExchange」アプリケーションをダウンロードしてインストールします。 Android: Google Play ストアで「LBank」を検索します。 「LBank-DigitalAssetExchange」アプリケーションをダウンロードしてインストールします。

AIツールとは何ですか? AIツールとは何ですか? Nov 29, 2024 am 11:11 AM

AI ツールには、Doubao、ChatGPT、Gemini、BlenderBot などが含まれます。

清算を回避するには、Huobi 先物契約にどのくらいの証拠金が必要ですか? 清算を回避するには、Huobi 先物契約にどのくらいの証拠金が必要ですか? Jul 02, 2024 am 11:17 AM

Huobi契約の清算は、証拠金不足による強制清算です。清算を避けるために、証拠金率は主流通貨契約の場合は 10% 以上、非主流通貨契約の場合は 20% 以上が推奨されます。証拠金の計算式:清算に必要な証拠金=約定金額/(1ストップ損失率/始値)。高いマージン率は清算のリスクを軽減します。約定取引はレバレッジ比率が高く、リターンとリスクが共存するため、証拠金の管理には十分な注意が必要です。

Delphi Digital:新しいElizaos V2アーキテクチャを解析することにより、新しいAIエコノミーを変更する方法は? Delphi Digital:新しいElizaos V2アーキテクチャを解析することにより、新しいAIエコノミーを変更する方法は? Mar 04, 2025 pm 07:00 PM

ElizaOSV2:AIのエンパワーメントAIは、補助ツールから独立したエンティティに進化しています。この記事では、ElizaOSV2の主要な革新と、AI主導の将来の経済をどのように形成するかについて説明します。 AIオートメーション:Elizaosを独立して操作することは、もともとWeb3オートメーションに焦点を当てたAIフレームワークでした。 V1バージョンを使用すると、AIはスマートコントラクトとブロックチェーンデータと対話できますが、V2バージョンは大幅なパフォーマンスの改善を実現します。単純な指示を実行する代わりに、AIはワークフローを独立して管理し、ビジネスを運営し、財務戦略を開発することができます。アーキテクチャのアップグレード:強化a

トップマーケットメーカーが暗号市場に参入すると、キャッスル証券は業界にどのような影響を与えますか? トップマーケットメーカーが暗号市場に参入すると、キャッスル証券は業界にどのような影響を与えますか? Mar 04, 2025 pm 08:03 PM

トップマーケットメーカーのキャッスル証券のビットコインマーケットメーカーへの参入は、ビットコイン市場の成熟度の象徴であり、将来の資産価格設定力を競うための従来の金融勢力の重要なステップです。ブルームバーグによると、2月25日、シタデル証券は暗号通貨の流動性プロバイダーになろうとしています。同社は、Coinbaseglobal、Binanceholdings、Crypto.comが運営する取引所など、さまざまな取引所でマーケットメーカーのリストに参加することを目指していると、この問題に精通している人々は述べています。取引所によって承認されると、当社は当初、米国外にマーケットメーカーチームを設立することを計画していました。この動きは標識だけではありません

See all articles