2017-07-22 12 views
1

に点在しています。またはJavaのネストされたメソッドに似ています。私はちょうど同じ仕事のためのより多くのコードを避けるふりをする。ゴー機能は、私がこれを構築したいの表記

私はこれを行うにはしたくない:

result, err := new(Function1(whatever type)) //or *Function1(whatever type) 
if err != nil {...} 
result1, err := result.Function2(whatever type) 
if err != nil {...} 
finalResult, err := result1.Function3(whatever type) 
if err != nil {...} 

私は構造体とのインターフェースでいくつかのオプションをしようとしてきたが、私はどんな結果を得ることができません。

私の文法に間違いがあると私は謝罪します。私はまだ自分のスキル英語でうまくいきません。

おかげで、

デビッド

答えて

1

あなたはFluent APIデザインパターンを意味すると思います。あなたは同じオブジェクト、または構造体をGoで何度も何度も返します。

このパターンでは、タプルまたは複数の戻り値の型を返すことはできません。 1つのオブジェクトだけを返すことができます。

https://play.golang.org/p/9PceZwi1a3

package main 

import (
    "fmt" 
) 

type Object struct { 
    Value string 
    Error error 
} 

func (o *Object) Before(s string) *Object { 
    o.Value = s + o.Value 
    // add an error if you like 
    // o.Error = error.New(...) 
    return o 
} 

func (o *Object) After(s string) *Object { 
    // could check for errors too 
    if o.Error != nil { 
     o.Value = o.Value + s 
    } 
    return o 
} 

func main() { 
    x := Object{} 

    x. 
     Before("123"). 
     After("456"). 
     After("789"). 
     Before("0") 

    if x.Error != nil { 
     // handle error 
    } 
    fmt.Println(x.Value) 
} 

編集:sberryの答えは、良いアイデアを持っていました。 Object構造体にエラー状態を追加すると、uが各func呼び出しのエラーをチェックできるようになります。


あなたは新しいので、すべての回答を評価し、答えを導くと信じる最高のものを覚えておいてください。

0

FunctionXは(ほとんどの場合、ポインタ受信機あなたが変異している場合状態)レシーバーの方法であることがあり、それらをそれぞれのリターンを持っているだろう、これを行うための唯一の方法受信機。そう

type someNumber struct { 
    n int32 
} 

func (s *someNumber) Add(i int32) *someNumber { 
    s.n += i 
    return s 
} 

func (s *someNumber) Multiply(i int32) *someNumber { 
    s.n *= i 
    return s 
} 

func (s *someNumber) Subtract(i int32) *someNumber { 
    s.n -= i 
    return s 
} 

func main() { 
    num := &someNumber{n: 0} 
    result := num.Add(5).Multiply(4).Subtract(10) 
    fmt.Println(result.n) 
} 

ようにあなたが設定し、エラーsomeNumber上だけでなく、最後にそれをチェックすることができます。

エラーを実際に実行する場合は、このような処理を行う必要があります。

func Function1(a int, err error) (int, error) { 
    if err != nil { 
     return a, err 
    } 
    return a, nil 
} 

func Function2(a int, err error) (int, error) { 
    if err != nil { 
     return a, err 
    } 
    return a*2, nil 
} 


func Function3(a int, err error) (int, error) { 
    if err != nil { 
     return a, err 
    } 
    return a*3, nil 
} 

func main() { 
    a, err := Function3(Function2(Function1(1, nil))) 
    fmt.Println(a, err) 
} 

しかし、エラーモナドがもたらす行動のタイプを探しているようで、Goには存在しません。

関連する問題