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

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

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

來源: 責編: 時間:2024-04-02 17:23:20 191觀看
導讀一些基礎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檢測"    }}

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

map 訪問

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

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

強制類型轉換

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

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

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

空指針引用

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

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

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

給定代碼如下:i1a28資訊網——每日最新資訊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}

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

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

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

錯誤處理

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

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

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

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

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

Go 報錯

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

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

重名類

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

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

變量 models 與包名沖突

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

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

反序列化錯誤

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

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

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

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

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

循環包引用

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

方法簽名不一致

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

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

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

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

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

方法實現不對

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

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

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

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

返回類型不一致

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

實際上 h.beyondLoginWhiteRuleCache.GetWithLoader 要返回的是 []*models.WhiteRuleDO 而不是 *models.WhiteRuleDO。i1a28資訊網——每日最新資訊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    })

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

JSON 反序列化

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

Unmarshal NPE

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

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

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

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

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

字段未導出

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

字段名需要改成首字母大寫。i1a28資訊網——每日最新資訊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

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

實際參數多了

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

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

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

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

Reference

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

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

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

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

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

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 7月安卓手機性價比榜:努比亞+紅魔兩款新機入榜

    7月登場的新機有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產品,而且努比亞和紅魔也一貫有著不錯的性價比,所以在本次的性價比榜單
  • 自動化在DevOps中的力量:簡化軟件開發和交付

    自動化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動化工具和方法,DevOps團隊可以實現以下目標:消除手動和重復性任務。簡化流程。在整個軟件開發生命周期中實現更
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • Python異步IO編程的進程/線程通信實現

    這篇文章再講3種方式,同時講4中進程間通信的方式一、 Python 中線程間通信的實現方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己“當家”的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業領先的性能,令人印象深刻的電池續航,精美豐
Top 主站蜘蛛池模板: 禄丰县| 漾濞| 区。| 定陶县| 泗水县| 上虞市| 绥德县| 青阳县| 岫岩| 通榆县| 滨州市| 吴忠市| 牡丹江市| 营山县| 高雄县| 高安市| 宁远县| 淳化县| 横峰县| 安仁县| 邵阳县| 临高县| 英吉沙县| 原平市| 徐州市| 克什克腾旗| 南昌县| 桃园县| 普安县| 潮安县| 民勤县| 榕江县| 临澧县| 汕尾市| 黄骅市| 唐海县| 子洲县| 宁武县| 龙泉市| 高密市| 泸水县|