2017-06-23 85 views
-1

我有方法,看起來像這樣:函數,返回結構或錯誤

var eventNotDetected = errors.New("Event not detected") 

type VoucherUsageEvent struct { 
    M models.M 
} 

func detectVoucherUsageEvent(_ uint64, changeset changelog.Changeset) (VoucherUsageEvent, error) { 
    var event VoucherUsageEvent 

    if changeset.GetHeader().Table != db.TABLE_NAME { 
     return event, eventNotDetected 
    } 

    switch changeset.(type) { 
    case changelog.InsertChangeset, changelog.UpdateChangeset: 
     m, err := models.Map(changeset) 

     if err != nil { 
      return event, err 
     } 

     return VoucherUsageEvent{m}, nil 

    default: 
     return event, eventNotDetected 
    } 
} 

的想法是,它可以返回一個對象實例與否,取決於輸入。如果對象實例不能返回,函數應該指出爲什麼它不能被返回(在映射期間發生錯誤,或者只是未找到)

當函數沒有返回時,返回簽名有點奇怪實例,例如:

return event, eventNotDetected 
return event, err 

基本上我只是用event因爲我不能只返回零。

或者是更好的辦法,只是返回在這種情況下的參考,這樣我就可以恢復的情況下更改爲:爲指針*VoucherUsageEvent

return nil, eventNotDetected 
return nil, err 
+0

如果僅* *理由你會返回一個指針,而不是零值,是因爲你不喜歡的收益語義,只需返回零值。指針和值之間的決定不應僅僅基於返回語句的外觀。 – Adrian

+0

最後,我返回了一個接口,它可以返回零,並使指針消失。 – Max

回答

0

是的,你可以定義輸出參數。

func detectVoucherUsageEvent(_ uint64, changeset changelog.Changeset) (*VoucherUsageEvent, error) 

返回作爲參考或無。

return &VoucherUsageEvent{m}, nil 

OR

return &event, eventNotDetected 

OR

return nil, err 
+0

我對Go比較陌生,所以這被認爲是不錯的做法/優先於返回結構作爲非參考? – Max

+0

是的。它也基於你的用例。無論您是需要回報作爲參考還是非參考。請參閱此[SO帖子](https://stackoverflow.com/a/23551970)瞭解更多。 – jeevatkm