亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

簡化golang中if else的表達

簡化golang中if else的表達

Go
瀟瀟雨雨 2022-10-24 15:05:26
我有頭部、最后、頁面、限制和偏移過濾器的邏輯模塊。如 :../example/param 如果沒有查詢,返回所有值../example/param?limit=10 返回前 10 個值..example/param?offset=3 從數字 4 到 23 返回值(默認限制為 20)..example/param?limit=15&offset=2 返回值 3 到 17../example/param?page=2&limit=5 返回值 6 到 10../example/param?head=15 返回前 15 個值../example/param?last=15 返回最后 15 個值../example/param?head=8&last=4 返回錯誤../example/param?page=3&offset=4 返回錯誤../example/param?page=2&limit=5&offset=6 返回錯誤我有默認參數,如:var defaultPageParameter = PageParameter{Limit:  20,Offset: 0,Page: 1,Head: 0,Last: 0,}limit := pagePara.Limitoffset := pagePara.Offsetpage := pagePara.Pagehead := pagePara.Headlast := pagePara.LastdefaultPage := defaultPageParameter.PagedefaultLimit := defaultPageParameter.LimitdefaultOffset := defaultPageParameter.Offsetpaginate := (page*limit)-limitif else 我已經寫了一些表達式,但是這段代碼真的太多了,我想簡化代碼。
查看完整描述

1 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

在不了解更多周圍代碼的情況下,很難簡化整個事情并為您提供完成的代碼。


但是我有幾個建議給你,我認為你可以應用這些建議來簡化你自己的邏輯。


建議 #1

我在這里看到的一個問題是使邏輯更加混亂,這是int輸入變量(偏移量、限制、頁面、頭部、最后)的基本類型()的使用。


問題是您正在將輸入變量與默認值(在 Go 中稱為“零值”)進行比較,例如 0,或者defaultLimit您實際嘗試檢查的是用戶是否提供了這些輸入。


我的建議是使這些輸入變量指針 ( *int),以便您可以將它們與它們進行比較,nil以便更輕松、更清楚地檢查用戶是否發送了這些輸入。我認為這將使邏輯更具可讀性。


例如,offset & limit 你可以簡化成這樣的:


if offset != nil {

  opt.SetSkip(*offset)

}


if limit != nil {

  opt.SetLimit(*limit)

}

建議#2

我還建議以不同的方式處理錯誤。


首先檢查錯誤情況。如果輸入無效,則返回錯誤。


如果沒有錯誤,然后處理成功案例。這是用 Golang(以及其他語言)編寫代碼的一種非常常見的方式。


像這樣的東西:


// in the function from your post:


// check for error cases

err := checkError(offset, limit, page, head, last)

if err != nil {

  return make([]bson.M, 0), err

}


// handle success (non error) cases

if offset == defaultOffset && limit != defaultLimit && page == defaultPage {

    opt.SetLimit(limit)

    //if just limit

} else if // ... the rest of the success cases ...



// ... elsewhere in the same file (or package) ...


func checkError(offset, limit, page, head, last int) error {

  if offset != defaultOffset && limit != defaultLimit && page != defaultPage && head != 0 && last != 0{

      return errors.New("can't show all queries")

      //if there are all query

  } else if offset != defaultOffset && limit != defaultLimit && page != defaultPage {

      return errors.New("can't show all queries")

      //if there are all query

  } else if offset != defaultOffset && limit == defaultLimit && page != defaultPage{

      return errors.New("can't merge page and offset")

      //if combine page & offset

  } else if head != 0 && last != 0 {

      return errors.New("can't merge head and last")

      //if combine head & last

  } else if limit <=0 || page <= 0{

      return errors.New("BSON field value must be >= 0, actual value -20")

      //if limit & page value smaller than 0

  }


  return nil

}


查看完整回答
反對 回復 2022-10-24
  • 1 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號