検索
ホームページバックエンド開発GolangIBM fp-go を使用した Go の関数型プログラミング: 明示的なエラー処理

Functional Programming in Go with IBM fp-go: Error Handling Made Explicit

関数型プログラミング (FP) の原則は、不変性、構成可能性、および明示性を重視しているため、現代のソフトウェア開発で人気が高まっています。 Go は伝統的に命令型言語ですが、IBM によって開発された fp-go ライブラリでは、Option、Either、Fold、関数合成用のユーティリティなどの FP 抽象化が導入されています。この記事では、fp-go を使用してエラーを明示的に処理し、複数のエラー タイプの関数シグネチャを定義し、これらの概念を示す実際の CRUD API サンプルを構築する方法を検討します。

なぜ機能エラー処理を行うのか?

エラー処理は、信頼性の高いソフトウェアを構築するために非常に重要です。従来の Go エラー処理は返されるエラー値に依存しているため、意図せずに無視されたり、誤って処理されたりする可能性があります。機能エラー処理では、次のような抽象化が導入されます。

  1. Option: 他の FP 言語の Some と None に似たオプションの値を表します。
  2. Either: Right (成功) または Left (失敗) のいずれかの値をカプセル化して、エラーの伝播を明示します。
  3. タグ付き共用体: 関数のシグネチャで考えられるエラーの種類を明確に定義できるようにします。
  4. Composition: エラーを自然に処理しながら操作の連鎖を有効にします。

これらの概念を詳しく見て、fp-go が Go でどのようにそれらを容易にするかを見てみましょう。


fp-go の入門

まず、fp-go を Go プロジェクトに追加します。

go get github.com/IBM/fp-go

必要なモジュールをインポートします:

import (
    either "github.com/IBM/fp-go/either"
    option "github.com/IBM/fp-go/option"
)

オプション: オプションの値の処理

オプションは、存在する場合も存在しない場合もある値を表します。 Some(value) または None のいずれかです。

例: 整数の解析

func parseInt(input string) option.Option[int] {
    value, err := strconv.Atoi(input)
    if err != nil {
        return option.None[int]()
    }
    return option.Some(value)
}

func main() {
    opt := parseInt("42")

    option.Fold(
        func() { fmt.Println("No value") },
        func(value int) { fmt.Printf("Parsed value: %d\n", value) },
    )(opt)
}

重要なポイント:

  • オプションは nil 値を削除します。
  • Fold は両方のケース (一部またはなし) を処理するために使用されます。

いずれか: エラーを明示的に処理する

どちらも、次の 2 つの可能性が生じる計算を表します。

  1. : エラーを表します。
  2. : 成功した結果を表します。

例: 安全な分割

type MathError struct {
    Code    string
    Message string
}

func safeDivide(a, b int) either.Either[MathError, int] {
    if b == 0 {
        return either.Left(MathError{Code: "DIV_BY_ZERO", Message: "Cannot divide by zero"})
    }
    return either.Right(a / b)
}

func main() {
    result := safeDivide(10, 0)

    either.Fold(
        func(err MathError) { fmt.Printf("Error [%s]: %s\n", err.Code, err.Message) },
        func(value int) { fmt.Printf("Result: %d\n", value) },
    )(result)
}

重要なポイント:

  • どちらかが成功の道と失敗の道を分けます。
  • Fold を使用すると、両方のケースを 1 か所で簡単に処理できます。

複数のエラー タイプを含む関数シグネチャ

実際のアプリケーションでは、多くの場合、複数の種類のエラーを処理する必要があります。タグ付き共用体を使用すると、明示的なエラー タイプを定義できます。

例: エラーのタグ付きユニオン

go get github.com/IBM/fp-go

利点:

  • タグ付けされた共用体はエラーを自ら文書化します。
  • 明示的な型により、エラー処理の曖昧さが軽減されます。

実際の例: CRUD API

Either を使用して明示的なエラー処理を備えたシンプルな CRUD API を実装してみましょう。

モデルとエラーの定義

import (
    either "github.com/IBM/fp-go/either"
    option "github.com/IBM/fp-go/option"
)

リポジトリ層

func parseInt(input string) option.Option[int] {
    value, err := strconv.Atoi(input)
    if err != nil {
        return option.None[int]()
    }
    return option.Some(value)
}

func main() {
    opt := parseInt("42")

    option.Fold(
        func() { fmt.Println("No value") },
        func(value int) { fmt.Printf("Parsed value: %d\n", value) },
    )(opt)
}

サービス層

type MathError struct {
    Code    string
    Message string
}

func safeDivide(a, b int) either.Either[MathError, int] {
    if b == 0 {
        return either.Left(MathError{Code: "DIV_BY_ZERO", Message: "Cannot divide by zero"})
    }
    return either.Right(a / b)
}

func main() {
    result := safeDivide(10, 0)

    either.Fold(
        func(err MathError) { fmt.Printf("Error [%s]: %s\n", err.Code, err.Message) },
        func(value int) { fmt.Printf("Result: %d\n", value) },
    )(result)
}

コントローラー

type AppError struct {
    Tag     string
    Message string
}

const (
    MathErrorTag    = "MathError"
    DatabaseErrorTag = "DatabaseError"
)

func NewMathError(msg string) AppError {
    return AppError{Tag: MathErrorTag, Message: msg}
}

func NewDatabaseError(msg string) AppError {
    return AppError{Tag: DatabaseErrorTag, Message: msg}
}

func process(a, b int) either.Either[AppError, int] {
    if b == 0 {
        return either.Left(NewMathError("Division by zero"))
    }
    return either.Right(a / b)
}

func main() {
    result := process(10, 0)

    either.Fold(
        func(err AppError) { fmt.Printf("Error [%s]: %s\n", err.Tag, err.Message) },
        func(value int) { fmt.Printf("Processed result: %d\n", value) },
    )(result)
}

結論

Go で fp-go を使用すると、次のことができます。

  • Either を使用してエラーを明示的にモデル化します。
  • オプションの値は Option で表します。
  • タグ付き共用体を介して複数のエラー タイプを処理します。
  • 保守可能で構成可能な API を構築します。

これらのパターンにより、Go コードがより堅牢になり、読みやすく、機能的になります。 CRUD API を構築している場合でも、複雑なビジネス ロジックを構築している場合でも、fp-go を使用すると、エラーをクリーンかつ一貫して処理できます。

以上がIBM fp-go を使用した Go の関数型プログラミング: 明示的なエラー処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Go String Manipulationを学ぶ:「文字列」パッケージを使用しますGo String Manipulationを学ぶ:「文字列」パッケージを使用しますMay 09, 2025 am 12:07 AM

Goの「文字列」パッケージは、文字列操作を効率的かつシンプルにするための豊富な機能を提供します。 1)文字列を使用して()サブストリングを確認します。 2)Strings.split()を使用してデータを解析できますが、パフォーマンスの問題を回避するには注意して使用する必要があります。 3)文字列join()は文字列のフォーマットに適していますが、小さなデータセットの場合、ループ=はより効率的です。 4)大きな文字列の場合、文字列を使用して文字列を構築する方が効率的です。

GO:標準の「文字列」パッケージを使用した文字列操作GO:標準の「文字列」パッケージを使用した文字列操作May 09, 2025 am 12:07 AM

GOは、文字列操作に「文字列」パッケージを使用します。 1)文字列を使用して、関数を調整して文字列をスプライスします。 2)文字列を使用して、コンテイン関数を使用してサブストリングを見つけます。 3)文字列を使用して、文字列を交換します。これらの機能は効率的で使いやすく、さまざまな文字列処理タスクに適しています。

Goの「バイト」パッケージを使用したバイトスライス操作の習得:実用的なガイドGoの「バイト」パッケージを使用したバイトスライス操作の習得:実用的なガイドMay 09, 2025 am 12:02 AM

byteSpackageIngoisESSENTINEFOREFFICTIENTBYTESLICEMANIPULATION、functionslikeContains、andReplaceforseding andmodyifiedbinarydata.itenhancesperformance andCodereadability、make dakeatavitaltoolfor forhandlingbingbinarydata、networkprotocols、andfilei

Go Binary Encoding/Decoding:「エンコード/バイナリ」パッケージを使用してくださいGo Binary Encoding/Decoding:「エンコード/バイナリ」パッケージを使用してくださいMay 08, 2025 am 12:13 AM

GOは、バイナリエンコードとデコードに「エンコード/バイナリ」パッケージを使用します。 1)このパッケージは、binary.writeとbinary.read関数を作成して、データを書き込み、読み取ります。 2)正しいエンディアン(BigendianやLittleendianなど)の選択に注意してください。 3)データのアラインメントとエラー処理も重要です。データの正確性とパフォーマンスを確保します。

GO:標準の「バイト」パッケージを使用したバイトスライス操作GO:標準の「バイト」パッケージを使用したバイトスライス操作May 08, 2025 am 12:09 AM

「バイト」パッケージを包装してください

エンコード/バイナリパッケージに移動:バイナリ操作のパフォーマンスの最適化エンコード/バイナリパッケージに移動:バイナリ操作のパフォーマンスの最適化May 08, 2025 am 12:06 AM

Encoding/binaryPackageIngoiseffictevectiveforptimizingdueToitssuportforendiannessandannessandAhandling.toenhanceperformance:1)usebinary.native.nativedianfornatiannesstoavoidbyteswapping.2)batchedandandandwriteTerationtoredutei/ober

BYTESパッケージに移動:短いリファレンスとヒントBYTESパッケージに移動:短いリファレンスとヒントMay 08, 2025 am 12:05 AM

GOのBYTESパッケージは、主にバイトスライスを効率的に処理するために使用されます。 1)bytes.bufferを使用すると、弦のスプライシングを効率的に実行して、不必要なメモリの割り当てを避けます。 2)バイト機能を使用して、バイトスライスをすばやく比較します。 3)bytes.index、bytes.split、bytes.replaceall関数は、バイトスライスの検索と操作に使用できますが、パフォーマンスの問題に注意する必要があります。

BYTESパッケージに移動:バイトスライス操作の実用的な例BYTESパッケージに移動:バイトスライス操作の実用的な例May 08, 2025 am 12:01 AM

バイトパッケージは、バイトスライスを効率的に処理するためのさまざまな機能を提供します。 1)bytes.containsを使用して、バイトシーケンスを確認します。 2)bytes.splitを使用してバイトスライスを分割します。 3)バイトシーケンスバイトを交換します。 4)bytes.joinを使用して、複数のバイトスライスを接続します。 5)bytes.bufferを使用してデータを作成します。 6)エラー処理とデータ検証のためのBYTES.MAPの組み合わせ。

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

DVWA

DVWA

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

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。