2017-07-22 43 views
1

我想建立這樣的:類似於JavaScript中的承諾,但不一定是相同的概念轉到功能點記號

finalResult, err := Function1(whatever type) 
    .Function2(whatever type) 
    .Function3(whatever type) 

東西。或者類似於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

我認爲你的意思是流利的API設計模式。您一遍又一遍地返回相同的對象或Go中的結構體。

這種模式不允許你返回一個元組或者多個返回類型。你只能返回一個對象。

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結構本身上添加一個錯誤狀態,它可以讓你檢查每個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) 
} 

但是,看起來您正在尋找Error Monad會帶來的行爲類型,而這在Go中不存在。