日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用c语言写代码_如何避免用动态语言的思维写Go代码

發布時間:2023/12/2 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用c语言写代码_如何避免用动态语言的思维写Go代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于招聘市場上Go工程師的供給量不足,所以在招人的時候我們招了不少愿意轉型用Go語言進行開發的PHP工程師,不過雖說換了個語言,在他們代碼的時候還是能發現很多PHP的影子。if語句后面非要帶括號這種問題就不說了,這屬于不懂事,gofmt就會強行把你掰過來。最大的問題還是因為以前用慣了PHP的數組,到寫Go代碼時還是不習慣先定義類型后使用這種習慣。還有就是以前寫PHP的時候可能沒養成使用異常的習慣,在返回值里約定特殊值來代表錯誤。所以后面我在團隊內部做過一次培訓,專門分享了怎么建立正確的Go編碼習慣,以下是節選了當時演講稿的一部分。其實不是專門針對PHP程序員,可能寫動態語言的程序員在開始用Go寫代碼時都容易犯的一些錯誤。

Go編程的注意事項及建議

接下來我們會說幾個PHP程序員在剛開始用Go寫程序時幾個需要改變的編碼習慣和要注意的地方。

盡量使用結構體切片代替字典

我們有的新同學特別愛使用Go里面的Map,有的時候還是切片里邊套Map,比如我看一開始有的同學把一些配置信息放在map[string]string類型的Map里,多個的話再把Map放進切片里,比如這樣。

var?configMap?=?[]map[string]string{?{??"stockNum":?"100",??"name":?????"芒果TV周卡",??"type":?????"virtual",????},}

后面程序使用的時候再去用鍵去取值,這么做程序當然能實現,但你會發現Go里面因為是強類型,你在用上面字典里面的數值時還得對他們做類型轉換。很多同學馬上會說,那我把Map的類型換成map[string]interface{},我只能說你試試,看你用的時候Go讓不讓你做類型斷言。

這其實是涉及一個思維的轉變,那么在像Go這樣的強類型語言里針對這種情況該怎么辦呢?這就需要讓我們養成先定義結構體類型后使用的習慣了,比如像上面的情況我就可以先定義一個類型。

type?Product?struct?{?StockNum??int64?Name??????string?Type??????string}var?configs?=?[]*Product?{?{??StockNum:?100,??Name:?"芒果TV周卡",??Type:?"virtual",?},??......}

這么做就能避免像上面那樣使用StockNum前還得把它轉成整型的問題了,而且編輯器還能做類型提示,不需要你刻意記得Map里的鍵,還能避免你一時疏忽把鍵拼錯導致BUG的尷尬。

除了上面說的還有人喜歡在返回值里返回Map,這種寫法除了會導致上面說的那樣問題,讓別人使用起來也特別不方便。比如我要用你的方法我還得進去看看你的代碼里這個Map到底有哪些鍵。

所以我們寫Go代碼時,其實Map的使用率要比在PHP里使用數組低很多,很多時候都是用結構體以及結構體切片的,對于那種key為數據ID,值為數據Map的這種映射,也是改成Key為數據ID,值為數據自己定義的類型才對。比如下面這個Map類型的變量,它的Key是產品的ID,值的類型是我們上面定義的Product結構體

var?productMap?=?map[int64]*Product?{?123:??{??StockNum:?100,??Name:?"芒果TV周卡",??Type:?"virtual",?},}

針對這部分說的這個問題我覺得記住:**"根據數據先定類型再使用"**這個原則就行了。

說完這個在代碼里出現率最高的問題后,下面我們再說幾個寫Go代碼時的要注意的細節。

零值陷阱

未進行初始化的變量默認值為其類型的零值,需要注意的是slice,map,chan和*T類型對應的零值是nil。

這些類型的變量在未初始化前是無法在程序里直接使用的,有些情況下會導致運行時錯誤。

常見的兩種運行時錯誤是:

  • panic: assignment to entry in nil map
  • panic: invalid memory address or nil pointer dereference

第一個錯誤是因為對一個未初始化的map進行賦值導致的,所以使用map類型的變量前要記得用make函數對變量進行初始化,與map類似的切片在使用append函數 向nil slice追加新元素就可以,原因是append函數會生成新的切片,在底層為切片分配了底層數組。

第二個錯誤是對nil指針進行了解引用導致的,指針的零值nil與*T{}并不相等。所以指針類型的變量在使用前要注意使用new函數進行初始化。

還有就是前端同學們非常不喜歡接口返回值的字段有數據的時候是個列表,沒數據的時候是Null,這也是切片未初始化導致的,如果數據庫里沒查到數據,那么在代碼邏輯里就執行不到給切片append數據的循環里,所以就會出現這個問題。這是一個保持接口字段類型一致性的一個很重要的細節。

使用error返回函數錯誤

在使用PHP時,函數的錯誤是通過拋出異常,甚至是通過返回0,false之類的值來表示函數遇到的錯誤(這種,即使寫PHP也不推薦這種做法)

比如好的寫法,可這樣寫:

public?function?updateUserFavorites(User?$user,?$favoriteData){????try?{????????//?database?execution????......????}?catch?(QueryException?$queryException)?{????????throw?new?UserManageException(func_get_args(),?'Error?Message',?'501'?,?$queryException);????}????return?true;}

但很多的人會這么寫:

public?function?updateUserFavorites(User?$user,?$favoriteData){????//?database?execution??if?($conn.AffectedRows?<=?0)?{????????return?false????}????return?true;}

在Go語言里雖然沒有異常機制,但是可以讓函數返回error明確遇到的錯誤。所以除非確定函數不需要返回error,多數情況下我們的函數都是需要返回error的,所以在定義函數時要明確,返回的數據和error的區別,兩種返回值的職責范圍不一樣。要通過函數返回的error是否為空,而不是返回數據是0或者false之類的值判斷函數是否執行成功。

謹慎使用map[string]interface{}做參數

寫過PHP的同學都知道,PHP里的數組近乎萬能,可以用來當列表、字典,而且當字典用時還能保證字典key的遍歷順序,這點是很多語言的字典類型辦不到的事情。

很多剛從PHP轉到用Go開發的同學還是帶著在PHP里使用數組參數的習慣,那么在Go語言里,最像PHP數組的可能就是map[string]interface{}了。

這種還是典型的動態語言編程的思維,在使用Go的時候,針對比較復雜的代表一類事物的參數,我們也是應該先定義結構體,然后使用結構體指針或者結構體指針切片作為參數。盡量不使用map[string]interface{}這種類型的參數,IDE也沒法幫助提示這些參數的內部結構,這讓其他人使用這個代碼時就會很苦惱,還得先看看函數實現里具體用到了字典的哪些鍵。比如下面這兩個函數的對比:

type?UserInput?struct{??Name?????string??Age??????int32??Password?string}func?AuthenticateUser(input?*UserInput)?error?{????findUser(input.Name,?input.Password)????...}func?DummyAuthenticateUser(input?map[string]interface{})?error?{????findUser(input["name"],?input["password"])????...}

一般在業務級別的程序開發里,我們要傳遞存儲在數據表里的額外信息的時候才會使用到map[string]interface{}類型的參數。寫表前把這部分數據編碼成JSON格式再寫入,當然這個主要看使用場景,凡事沒有絕對,這里只是強調一些在編碼習慣上的問題。

總結

最近兩年在學習中我寫了不少Go語言的文章,其中Web編程入門和Go并發編程這兩個系列我自認為還是對新手很有幫助的。

來源:網管叨bi叨

作者:KevinYan11

總結

以上是生活随笔為你收集整理的用c语言写代码_如何避免用动态语言的思维写Go代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。