日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Go 開發踩過的那些坑,你踩過幾個?

來源: 責編: 時間:2024-04-02 17:23:20 229觀看
導讀一些基礎Java 枚舉轉成 GoJavapublic enum DetectionMethodEnum { PROCESS_HASH("process_hash", "進程Hash檢測"), private final String type; private final String desc;}Go:type DetectionMethod strin

一些基礎

Java 枚舉轉成 Go

Javapublic enum DetectionMethodEnum {    PROCESS_HASH("process_hash", "進程Hash檢測"),    private final String type;    private final String desc;}Go:type DetectionMethod stringtype DetectionMethodInfo struct {    MethodType string    Desc       string}const (    ProcessHash  DetectionMethod = "PROCESS_HASH")var DetectionMethodMap = map[DetectionMethod]DetectionMethodInfo{    ProcessHash: {        MethodType: "process_hash",        Desc:       "進程Hash檢測"    }}

5bO28資訊網——每日最新資訊28at.com

map 訪問

Java:map.get(key)  or  map.getOrDefault(key, defaultValue)Go:if value, ok := map[key] ; ok {   // ...code}

5bO28資訊網——每日最新資訊28at.com

強制類型轉換

注意,轉換為 *Struct 和 轉換為 Struct 并不等同。如果你的值是指針,那么轉換為結構體會報錯;反之亦然。5bO28資訊網——每日最新資訊28at.com

Java:if (detectResultBase instanceof MemBackdoorDetectResult) {            MemBackdoorDetectResult detectResult = (MemBackdoorDetectResult) detectResultBase;            // ...code}Goif memBackdoorDetectResult, ok := detectResultBase.(*result.MemBackdoorDetectResult) ; ok {           // ...code}

5bO28資訊網——每日最新資訊28at.com

空指針引用

Java 的 NullPointerException 在 Go 變成了 nil pointer reference。5bO28資訊網——每日最新資訊28at.com

有兩個小區別:5bO28資訊網——每日最新資訊28at.com

  • 對 nil 進行 foreach , java 會報 NPE ,但是 Go 不會;
  • 對 nil 調用方法,java 會報 NPE, 但 Go 不會。

給定代碼如下:5bO28資訊網——每日最新資訊28at.com

  • range arr 時,Go 不會拋錯,java 會;
  • Go 能夠調用 SayHello 方法,調用 GetName() 時,在 return s.Name 報錯了,而不是在 GetName 的調用行數報錯。說明它走到方法里面了。問了下通義千問,大意是,方法并不屬于對象的內部數據結構,因此對 nil 訪問方法會轉到該結構體的方法表,但如果訪問 nil 的內部數據結構,則一定會拋 nil pointer reference
func TestBasic(t *testing.T) { var arr []int = nil for i := range arr {  fmt.Println(i) } var stu *Stu stu.SayHello() fmt.Println(stu.GetName())}type Stu struct { Name string}func (s *Stu) SayHello() { fmt.Println("hello")}func (s *Stu) GetName() string { return s.Name}

圖片圖片5bO28資訊網——每日最新資訊28at.com

圖片圖片5bO28資訊網——每日最新資訊28at.com

5bO28資訊網——每日最新資訊28at.com

錯誤處理

Go 的錯誤處理與 Java 也有較大區別。5bO28資訊網——每日最新資訊28at.com

  • Go 通過返回和判斷單獨的 error 來進行錯誤,應用必須對錯誤處理。如果忽略錯誤,則程序會繼續往下走,直到走完流程,或者在其它地方遇到 panic 而終止。如果忽略錯誤(可使用 _ 表示),且沒有日志(類似 Java catch 了但是什么都不做),則程序什么都不輸出。就好像突然在哪里斷掉了,但是你沒法知道在哪里斷掉了。問題排查會很蛋疼且耗時。
  • Java 如果遇到運行時異常,會自動往上拋,遇到捕獲的就按照指定程序處理,沒有捕獲的繼續往上拋。如果沒有任何處理,則最終會拋出異常。如果捕獲了異常卻不處理,也會什么都不輸出,當然,這是自找罪受。

換句話說,Go 的錯誤如果忽略又不打日志,程序就會毫無輸出,對排查很不方便。這意味著:Go 做處理處理會比較繁瑣,每一個方法如果有錯誤就應該拋出,每一個錯誤都必須決定是否處理,還是繼續往上拋。益處是:能夠培養縝密的錯誤處理習慣。像 Java 那樣隨意,肯定會遭到懲罰。5bO28資訊網——每日最新資訊28at.com

Go 錯誤處理的一些推薦做法:5bO28資訊網——每日最新資訊28at.com

  • 前端錯誤,打印請求參數(為空可以不打),在 error 里返回錯誤碼和錯誤信息【強制】。
  • 存儲層方法,比如 repository ,必須返回 errror ,方便上層根據錯誤處理【強制】。
  • 檢測流程,創建出錯,直接終止流程,并返回 Error【強制】。
  • API (庫方法、數據庫、中間件、外部接口等)返回的錯誤必須捕獲處理,否則程序會無聲息終止【強制】。
  • 非數據庫錯誤,如果有錯誤碼的,返回錯誤碼和錯誤信息;沒有錯誤碼的,默認返回 InternalError 或 SystemError【推薦】。
  • 編寫工具類方法,推薦返回 error 【推薦】。
  • 上層方法,根據情形處理:如果不影響流程(局部失敗不影響整體失敗的情形),則打印錯誤日志,然后繼續往下走;如果影響流程,直接終止流程,拋出 error 。

Go 報錯

不得不說, Go 的報錯真的是有點不知所云。咋一看,看半天都看不出什么問題,真是費眼睛!因此,我總結了些常見報錯類型,方便以后更快排查。5bO28資訊網——每日最新資訊28at.com

5bO28資訊網——每日最新資訊28at.com

重名類

可能是有兩個重名類 DO。比如有兩個同名類 A 和 B,本來應當引用 A,結果引用了 B。5bO28資訊網——每日最新資訊28at.com

Cannot use 'oldModels' (type []"xxx/internal/common/dal/service".T) as the type []"github.com/samber/lo".T5bO28資訊網——每日最新資訊28at.com

變量 models 與包名沖突

有時,你會發現包里確實聲明了這個變量、實例或結構體,但 IDE 就是報錯,找不到。很可能方法里的局部變量與包名沖突了。如下所示,有一個包名 models,又聲明了一個 models 變量,當然找不到啦!這種問題肉眼很難察覺。就像 Javascript 里,前面聲明了一個 password 變量,后面不小心寫成了 passord ,javascript 是不會報錯的(現在不知道會不會,好久沒寫 js 了)。5bO28資訊網——每日最新資訊28at.com

圖片圖片5bO28資訊網——每日最新資訊28at.com

反序列化錯誤

reason 字段的上報數據與類型定義不一致。5bO28資訊網——每日最新資訊28at.com

圖片圖片5bO28資訊網——每日最新資訊28at.com

存在包已經被刪除但引用沒有刪除

通常是因為之前在某個類里引用了某個包,后面又刪除了這個包,或者更改了包的位置導致。5bO28資訊網——每日最新資訊28at.com

圖片圖片5bO28資訊網——每日最新資訊28at.com

循環包引用

在 ”Go 包循環引用及對策[1] “ 一文里已經有講解過。5bO28資訊網——每日最新資訊28at.com

方法簽名不一致

類似問題可能是方法簽名不一致,比如方法函數簽名有返回值而實際傳入函數無返回值5bO28資訊網——每日最新資訊28at.com

cannot use calc (variable of type func()) as async.Consumer value in argument to taskExecutor.SubmitTask5bO28資訊網——每日最新資訊28at.com

函數參數沒有命名,只有類型

Function has both named and unnamed parameters '(ctx context.Context, []D)'5bO28資訊網——每日最新資訊28at.com

圖片圖片5bO28資訊網——每日最新資訊28at.com

方法實現不對

Go 沒有支持 lambda 表達式。寫慣了 Java 導致。5bO28資訊網——每日最新資訊28at.com

報錯:Invalid operation: func(key string) (*models.WhiteRuleDO,error) - (the operator - is not defined on func(key string) (*models.WhiteRuleDO, error))5bO28資訊網——每日最新資訊28at.com

Cannot use 'func(key string) (*models.WhiteRuleDO,error) ->' (type bool) as the type func(key string) (T, error)5bO28資訊網——每日最新資訊28at.com

圖片圖片5bO28資訊網——每日最新資訊28at.com

返回類型不一致

return whiteRulesInner, nil 處 報錯:Cannot use 'whiteRulesInner' (type []T) as the type *models.WhiteRuleDO5bO28資訊網——每日最新資訊28at.com

實際上 h.beyondLoginWhiteRuleCache.GetWithLoader 要返回的是 []*models.WhiteRuleDO 而不是 *models.WhiteRuleDO。5bO28資訊網——每日最新資訊28at.com

whiteRules, err := h.beyondLoginWhiteRuleCache.GetWithLoader(cacheKey, func(key string) (*models.WhiteRuleDO, error) {        // ..code        whiteRulesInner, err := h.whiteRuleService.List(ctx, whiteRuleQuery.Convert(ctx))        if err != nil {            return nil, err        }        return whiteRulesInner, nil    })

5bO28資訊網——每日最新資訊28at.com

JSON 反序列化

使用 Unmarshal 反序列化時,結構體的字段必須是首字母大寫,才能賦值成功,否則是默認值。5bO28資訊網——每日最新資訊28at.com

Unmarshal NPE

err := json_utils.Unmarshal(record.Value, fr) 報錯 ReadVal: can not read into nil pointer, error found5bO28資訊網——每日最新資訊28at.com

這個錯誤信息 "ReadVal: can not read into nil pointer, error found" 指的是在使用 json_utils.Unmarshal 進行 JSON 反序列化時,嘗試將 JSON 數據解碼到一個未初始化(nil)的指針變量 fr 中。5bO28資訊網——每日最新資訊28at.com

在 Go 語言中,如果有一個指針類型變量,如 *SomeStruct,在調用 Unmarshal 方法對 JSON 數據進行反序列化前,你需要確保該指針已經指向了一個實際的結構體實例,而不是 nil。5bO28資訊網——每日最新資訊28at.com

圖片圖片5bO28資訊網——每日最新資訊28at.com

5bO28資訊網——每日最新資訊28at.com

字段未導出

報錯 reflect.Value.Interface: cannot return value obtained from unexported field or method5bO28資訊網——每日最新資訊28at.com

字段名需要改成首字母大寫。5bO28資訊網——每日最新資訊28at.com

func (e *ElementOperationHistoryDO) SetDetail(detail any) {    if detail != nil {        detailType := reflect.TypeOf(detail).String()        struct_utils.SetFieldValue(detail, DetailType, detailType)        e.DetailInfo = struct_utils.StructToMap(detail)    }}func SetFieldValue(obj any, fieldName string, value any) {    v := reflect.ValueOf(obj).Elem()    if v.Kind() != reflect.Struct {        return    }    field := v.FieldByName(fieldName)    if !field.IsValid() {        return    }    field.Set(reflect.ValueOf(value))}將 detailInfo := &models.FileElementOperationDetailInfo{        Fpath: v.FileResponseAgentParam.FileName,}  傳給 detail

圖片圖片5bO28資訊網——每日最新資訊28at.com

實際參數多了

internal/ids_detect/eventflow/ability/UnifiedSsdeepDetect.go:157:62: got 3 type arguments but want 25bO28資訊網——每日最新資訊28at.com

函數聲明了 2 個泛型參數,卻傳入了 3 個泛型參數。5bO28資訊網——每日最新資訊28at.com

圖片圖片5bO28資訊網——每日最新資訊28at.com

圖片圖片5bO28資訊網——每日最新資訊28at.com

Reference

[1]Go 包循環引用及對策:https://www.cnblogs.com/lovesqcc/p/180777175bO28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-80886-0.htmlGo 開發踩過的那些坑,你踩過幾個?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 巧妙運用Redisson打造自定義限流注解,讓接口防刷更高效

下一篇: JVM 性能調優之通過 JProfile 和 JFR 分析系統瓶頸提升系統性能

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲精品一二三区| 欧美国产精品v| av成人免费| 日韩网站在线观看| 亚洲精品永久免费| 日韩视频一区二区三区在线播放| 亚洲精品免费一区二区三区| 亚洲日本激情| 在线中文字幕一区| 亚洲女性裸体视频| 久久精品国产精品亚洲综合| 久久美女性网| 欧美电影免费观看高清完整版| 欧美啪啪成人vr| 国产精品日韩专区| 激情校园亚洲| 亚洲免费大片| 亚洲欧美日韩国产另类专区| 久久精品99无色码中文字幕| 免费在线观看一区二区| 欧美日韩福利| 国产精品亚洲综合天堂夜夜| 国内精品久久久久久久果冻传媒 | 国产午夜精品麻豆| 精品1区2区| 国产一区二区高清视频| 国产午夜精品久久久久久免费视| 在线看片第一页欧美| 日韩亚洲不卡在线| 午夜精品偷拍| 欧美成年人视频网站| 欧美日韩高清一区| 国产亚洲精品aa| 亚洲日韩欧美视频| 午夜在线a亚洲v天堂网2018| 欧美a一区二区| 国产精品乱码久久久久久| 激情欧美一区二区三区| 一本色道久久综合亚洲精品不| 性做久久久久久久久| 欧美国产精品专区| 国产视频精品xxxx| 亚洲人线精品午夜| 性伦欧美刺激片在线观看| 欧美大片一区二区| 国产精品一区久久久久| 亚洲国产另类久久久精品极度| 亚洲视频1区2区| 麻豆精品视频在线| 国产精品美女久久| 91久久精品网| 久久国产精彩视频| 欧美视频一区二区三区…| 影音先锋亚洲视频| 亚洲一区国产一区| 欧美大学生性色视频| 国产亚洲电影| 99精品欧美一区| 国产精品一区二区久久久久| 亚洲国产精品尤物yw在线观看| 欧美一级视频精品观看| 欧美日产一区二区三区在线观看| 国产一区二区三区免费观看| 99国产麻豆精品| 久久夜精品va视频免费观看| 国产精品久久| 亚洲成人在线| 午夜激情亚洲| 欧美日韩视频专区在线播放 | 尤物精品在线| 亚洲欧美不卡| 欧美韩日一区| 国产一区二区三区久久久久久久久| 日韩视频在线永久播放| 欧美成人一区二区三区在线观看 | 国产精品一区二区三区观看| 日韩视频一区二区在线观看 | 欧美午夜精品久久久久久久| 亚洲黄色在线| 久久天天躁夜夜躁狠狠躁2022| 国产精品美女久久久浪潮软件 | 久久久国产精品一区| 国产精品视频一| 亚洲一级一区| 欧美视频在线观看视频极品| 亚洲黄色尤物视频| 免费人成网站在线观看欧美高清| 韩国一区二区三区在线观看| 午夜在线播放视频欧美| 国产精品久久网站| 在线亚洲成人| 欧美三级日韩三级国产三级 | 亚洲欧美精品suv| 国产精品国产成人国产三级| 中文精品视频| 欧美日韩一级视频| 一区二区三区波多野结衣在线观看| 欧美高清在线一区| 亚洲欧洲日本国产| 欧美成年视频| 91久久精品国产91久久| 欧美国产极速在线| 亚洲精品国产精品乱码不99按摩| 欧美粗暴jizz性欧美20| 亚洲欧洲中文日韩久久av乱码| 欧美丰满高潮xxxx喷水动漫| 91久久在线观看| 欧美精品在线播放| 一本色道久久| 国产精品高潮粉嫩av| 亚洲永久免费观看| 欧美日韩一区二区三区免费看 | 亚洲天堂成人在线观看| 国产精品久久国产精麻豆99网站| 亚洲影院在线观看| 国产欧美综合一区二区三区| 亚洲欧美日韩在线综合| 国产欧美一二三区| 亚洲男人的天堂在线观看| 国产精品一区二区视频| 欧美一区二区观看视频| 国内精品伊人久久久久av一坑| 久久九九电影| 1769国内精品视频在线播放| 欧美黄色aaaa| 亚洲图片欧美日产| 国产日韩高清一区二区三区在线| 久久精品国产一区二区三| 一区二区三区在线高清| 欧美高清视频免费观看| 9色国产精品| 国产精品亚洲综合| 久久精品一二三| 亚洲精品国产系列| 国产精品二区三区四区| 欧美有码视频| 在线欧美一区| 欧美三级网址| 久久国产视频网站| 亚洲人成7777| 国产精品免费在线| 久久亚洲精品中文字幕冲田杏梨| 亚洲精品无人区| 国产精品亚洲激情| 蜜臀久久久99精品久久久久久| 日韩一级免费| 国产手机视频一区二区| 欧美电影免费观看网站| 亚洲欧美另类在线观看| 有坂深雪在线一区| 欧美色欧美亚洲高清在线视频| 久久国产婷婷国产香蕉| 99精品视频免费全部在线| 国产日韩欧美三区| 欧美v日韩v国产v| 午夜精品久久久久久久久久久久 | 性色av一区二区三区在线观看 | 国产女主播一区二区三区| 久久久久久999| 亚洲日韩视频| 国产女精品视频网站免费 | 欧美日韩理论| 久久久人成影片一区二区三区观看| 日韩亚洲不卡在线| 国产一区二区精品丝袜| 欧美精品尤物在线| 欧美亚洲免费电影| 亚洲精品乱码久久久久久| 国产日韩一区二区| 欧美久久久久免费| 久久精品99国产精品酒店日本| 99精品视频免费在线观看| 狠狠噜噜久久| 国产精品mm| 蜜月aⅴ免费一区二区三区| 午夜免费日韩视频| 在线看国产日韩| 国产伦精品一区二区三| 欧美另类视频| 久久免费偷拍视频| 亚洲欧美精品在线观看| 亚洲精品字幕| 国内不卡一区二区三区| 欧美午夜三级| 欧美成人亚洲| 久久人人爽人人爽| 亚洲砖区区免费| 一本不卡影院| 亚洲国产日韩在线| 国产精品自拍网站| 欧美另类视频| 久热这里只精品99re8久| 亚洲欧美日韩国产一区二区三区| 亚洲精品国久久99热| 91久久精品日日躁夜夜躁国产| 亚洲黄页一区| 亚洲欧洲一区二区在线观看| 亚洲国产精品一区二区第四页av| 禁断一区二区三区在线| 精品盗摄一区二区三区| 亚洲国产精品久久91精品| 美女国产一区| 亚洲第一在线综合在线| 狠狠操狠狠色综合网|