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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Go 開(kāi)發(fā)踩過(guò)的那些坑,你踩過(guò)幾個(gè)?

來(lái)源: 責(zé)編: 時(shí)間:2024-04-02 17:23:20 173觀看
導(dǎo)讀一些基礎(chǔ)Java 枚舉轉(zhuǎn)成 GoJavapublic enum DetectionMethodEnum { PROCESS_HASH("process_hash", "進(jìn)程Hash檢測(cè)"), private final String type; private final String desc;}Go:type DetectionMethod strin

一些基礎(chǔ)

Java 枚舉轉(zhuǎn)成 Go

Javapublic enum DetectionMethodEnum {    PROCESS_HASH("process_hash", "進(jìn)程Hash檢測(cè)"),    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:       "進(jìn)程Hash檢測(cè)"    }}

99C28資訊網(wǎng)——每日最新資訊28at.com

map 訪問(wèn)

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

99C28資訊網(wǎng)——每日最新資訊28at.com

強(qiáng)制類型轉(zhuǎn)換

注意,轉(zhuǎn)換為 *Struct 和 轉(zhuǎn)換為 Struct 并不等同。如果你的值是指針,那么轉(zhuǎn)換為結(jié)構(gòu)體會(huì)報(bào)錯(cuò);反之亦然。99C28資訊網(wǎng)——每日最新資訊28at.com

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

99C28資訊網(wǎng)——每日最新資訊28at.com

空指針引用

Java 的 NullPointerException 在 Go 變成了 nil pointer reference。99C28資訊網(wǎng)——每日最新資訊28at.com

有兩個(gè)小區(qū)別:99C28資訊網(wǎng)——每日最新資訊28at.com

  • 對(duì) nil 進(jìn)行 foreach , java 會(huì)報(bào) NPE ,但是 Go 不會(huì);
  • 對(duì) nil 調(diào)用方法,java 會(huì)報(bào) NPE, 但 Go 不會(huì)。

給定代碼如下:99C28資訊網(wǎng)——每日最新資訊28at.com

  • range arr 時(shí),Go 不會(huì)拋錯(cuò),java 會(huì);
  • Go 能夠調(diào)用 SayHello 方法,調(diào)用 GetName() 時(shí),在 return s.Name 報(bào)錯(cuò)了,而不是在 GetName 的調(diào)用行數(shù)報(bào)錯(cuò)。說(shuō)明它走到方法里面了。問(wèn)了下通義千問(wèn),大意是,方法并不屬于對(duì)象的內(nèi)部數(shù)據(jù)結(jié)構(gòu),因此對(duì) nil 訪問(wèn)方法會(huì)轉(zhuǎn)到該結(jié)構(gòu)體的方法表,但如果訪問(wèn) nil 的內(nèi)部數(shù)據(jù)結(jié)構(gòu),則一定會(huì)拋 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}

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

99C28資訊網(wǎng)——每日最新資訊28at.com

錯(cuò)誤處理

Go 的錯(cuò)誤處理與 Java 也有較大區(qū)別。99C28資訊網(wǎng)——每日最新資訊28at.com

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

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

Go 錯(cuò)誤處理的一些推薦做法:99C28資訊網(wǎng)——每日最新資訊28at.com

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

Go 報(bào)錯(cuò)

不得不說(shuō), Go 的報(bào)錯(cuò)真的是有點(diǎn)不知所云。咋一看,看半天都看不出什么問(wèn)題,真是費(fèi)眼睛!因此,我總結(jié)了些常見(jiàn)報(bào)錯(cuò)類型,方便以后更快排查。99C28資訊網(wǎng)——每日最新資訊28at.com

99C28資訊網(wǎng)——每日最新資訊28at.com

重名類

可能是有兩個(gè)重名類 DO。比如有兩個(gè)同名類 A 和 B,本來(lái)應(yīng)當(dāng)引用 A,結(jié)果引用了 B。99C28資訊網(wǎng)——每日最新資訊28at.com

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

變量 models 與包名沖突

有時(shí),你會(huì)發(fā)現(xiàn)包里確實(shí)聲明了這個(gè)變量、實(shí)例或結(jié)構(gòu)體,但 IDE 就是報(bào)錯(cuò),找不到。很可能方法里的局部變量與包名沖突了。如下所示,有一個(gè)包名 models,又聲明了一個(gè) models 變量,當(dāng)然找不到啦!這種問(wèn)題肉眼很難察覺(jué)。就像 Javascript 里,前面聲明了一個(gè) password 變量,后面不小心寫成了 passord ,javascript 是不會(huì)報(bào)錯(cuò)的(現(xiàn)在不知道會(huì)不會(huì),好久沒(méi)寫 js 了)。99C28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

反序列化錯(cuò)誤

reason 字段的上報(bào)數(shù)據(jù)與類型定義不一致。99C28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

存在包已經(jīng)被刪除但引用沒(méi)有刪除

通常是因?yàn)橹霸谀硞€(gè)類里引用了某個(gè)包,后面又刪除了這個(gè)包,或者更改了包的位置導(dǎo)致。99C28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

循環(huán)包引用

在 ”Go 包循環(huán)引用及對(duì)策[1] “ 一文里已經(jīng)有講解過(guò)。99C28資訊網(wǎng)——每日最新資訊28at.com

方法簽名不一致

類似問(wèn)題可能是方法簽名不一致,比如方法函數(shù)簽名有返回值而實(shí)際傳入函數(shù)無(wú)返回值99C28資訊網(wǎng)——每日最新資訊28at.com

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

函數(shù)參數(shù)沒(méi)有命名,只有類型

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

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

方法實(shí)現(xiàn)不對(duì)

Go 沒(méi)有支持 lambda 表達(dá)式。寫慣了 Java 導(dǎo)致。99C28資訊網(wǎng)——每日最新資訊28at.com

報(bào)錯(cuò):Invalid operation: func(key string) (*models.WhiteRuleDO,error) - (the operator - is not defined on func(key string) (*models.WhiteRuleDO, error))99C28資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

返回類型不一致

return whiteRulesInner, nil 處 報(bào)錯(cuò):Cannot use 'whiteRulesInner' (type []T) as the type *models.WhiteRuleDO99C28資訊網(wǎng)——每日最新資訊28at.com

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

99C28資訊網(wǎng)——每日最新資訊28at.com

JSON 反序列化

使用 Unmarshal 反序列化時(shí),結(jié)構(gòu)體的字段必須是首字母大寫,才能賦值成功,否則是默認(rèn)值。99C28資訊網(wǎng)——每日最新資訊28at.com

Unmarshal NPE

err := json_utils.Unmarshal(record.Value, fr) 報(bào)錯(cuò) ReadVal: can not read into nil pointer, error found99C28資訊網(wǎng)——每日最新資訊28at.com

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

在 Go 語(yǔ)言中,如果有一個(gè)指針類型變量,如 *SomeStruct,在調(diào)用 Unmarshal 方法對(duì) JSON 數(shù)據(jù)進(jìn)行反序列化前,你需要確保該指針已經(jīng)指向了一個(gè)實(shí)際的結(jié)構(gòu)體實(shí)例,而不是 nil。99C28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

99C28資訊網(wǎng)——每日最新資訊28at.com

字段未導(dǎo)出

報(bào)錯(cuò) reflect.Value.Interface: cannot return value obtained from unexported field or method99C28資訊網(wǎng)——每日最新資訊28at.com

字段名需要改成首字母大寫。99C28資訊網(wǎng)——每日最新資訊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

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

實(shí)際參數(shù)多了

internal/ids_detect/eventflow/ability/UnifiedSsdeepDetect.go:157:62: got 3 type arguments but want 299C28資訊網(wǎng)——每日最新資訊28at.com

函數(shù)聲明了 2 個(gè)泛型參數(shù),卻傳入了 3 個(gè)泛型參數(shù)。99C28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片99C28資訊網(wǎng)——每日最新資訊28at.com

Reference

[1]Go 包循環(huán)引用及對(duì)策:https://www.cnblogs.com/lovesqcc/p/1807771799C28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-80886-0.htmlGo 開(kāi)發(fā)踩過(guò)的那些坑,你踩過(guò)幾個(gè)?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

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

下一篇: JVM 性能調(diào)優(yōu)之通過(guò) JProfile 和 JFR 分析系統(tǒng)瓶頸提升系統(tǒng)性能

標(biāo)簽:
  • 熱門焦點(diǎn)
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競(jìng)品的一加也坐不住了。一加中國(guó)區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • CSS單標(biāo)簽實(shí)現(xiàn)轉(zhuǎn)轉(zhuǎn)logo

    轉(zhuǎn)轉(zhuǎn)品牌升級(jí)后更新了全新的Logo,今天我們用純CSS來(lái)實(shí)現(xiàn)轉(zhuǎn)轉(zhuǎn)的新Logo,為了有一定的挑戰(zhàn)性,這里我們只使用一個(gè)標(biāo)簽實(shí)現(xiàn),將最大化的使用CSS能力完成Logo的繪制與動(dòng)畫效果。新logo
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數(shù)據(jù)的地方,是數(shù)據(jù)源的一種,比如大家經(jīng)常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數(shù)據(jù),它既可以保
  • 谷歌KDD'23工作:如何提升推薦系統(tǒng)Ranking模型訓(xùn)練穩(wěn)定性

    谷歌在KDD 2023發(fā)表了一篇工作,探索了推薦系統(tǒng)ranking模型的訓(xùn)練穩(wěn)定性問(wèn)題,分析了造成訓(xùn)練穩(wěn)定性存在問(wèn)題的潛在原因,以及現(xiàn)有的一些提升模型穩(wěn)定性方法的不足,并提出了一種新
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業(yè) 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁(yè)“充值中心”入口上線了本機(jī)生活界面。壹覽商業(yè)發(fā)現(xiàn),該界面目前主要
  • “又被陳思誠(chéng)騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國(guó)產(chǎn)懸疑電影,成了陳思誠(chéng)的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠(chéng)再度風(fēng)頭無(wú)兩。你可以說(shuō)陳思誠(chéng)的
  • 8月見(jiàn)!小米MIX Fold 3獲得3C認(rèn)證:支持67W快充

    這段時(shí)間以來(lái),包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 榮耀Magicbook V 14 2021曙光藍(lán)版本正式開(kāi)售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍(lán)版本正式開(kāi)售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內(nèi)存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤鍵程、
  • DRAM存儲(chǔ)器10月價(jià)格下跌,NAND閃存本月價(jià)格與上月持平

    10月30日,據(jù)韓國(guó)媒體消息,自今年年初以來(lái)一直在上漲的 DRAM 存儲(chǔ)器的交易價(jià)格僅在本月就下跌了近 10%,此次是全年首次降價(jià),而NAND 閃存本月價(jià)格與上月持平。市
Top 主站蜘蛛池模板: 凤翔县| 福建省| 商水县| 梅河口市| 广昌县| 抚顺市| 阳新县| 扎兰屯市| 武义县| 鄂托克旗| 昌吉市| 融水| 儋州市| 九台市| 彰化市| 盈江县| 进贤县| 临城县| 安阳市| 和静县| 浮梁县| 邓州市| 元阳县| 外汇| 山东省| 新龙县| 神木县| 北辰区| 扎鲁特旗| 高唐县| 长宁县| 重庆市| 朝阳县| 呼玛县| 北安市| 江华| 樟树市| 新竹县| 襄樊市| 寿阳县| 米林县|