bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

go語言posteof go語言post請求

我正在學習Go語言網絡編程部分,太抽象了有點看不懂啊,哪位大神能夠通俗易懂給我解釋下這個代碼的意思啊

本質上,是作為文件處理的,發送是“write,print”,接受是“read”。

創新互聯自2013年創立以來,先為黔西等服務建站,黔西等地企業,進行企業商務咨詢服務。為黔西企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

連接相當于打開文件。

Go 中這么多創建 error 的方式,你真的了解它們各自的應用場景嗎

在Go中,error是一種內建的數據類型。在Go中被定義為一個接口,定義如下:

由此可知,該接口只有一個返回字符串的Error函數,所有的類型只要實現了該函數,就創建了一個錯誤類型。

創建error的方式包括errors.New、fmt.Errorf、自定義實現了error接口的類型等。

2.1 通過errors.New方法創建

通過該方法創建的錯誤一般是可預知的錯誤。簡單來說就是調用者通過該錯誤信息就能明確的知道哪里出錯了,而不需要再額外的添加其他上下文信息,我們在下面的示例中詳細說明。

我們看New方法的實現可知,實際上是返回了一個errorString結構體,該結構體包含了一個字符串屬性,并實現了Error方法。代碼如下:

error.New使用場景1 :

通過errors.New函數創建局部變量或匿名變量,且不在調用函數中進行值或類型判斷的處理,只打印或記錄錯誤日志的場景。

使用示例1 :

以下代碼節選自源碼/src/net/http/request.go中解析PostForm的部分。 當請求中的Body為nil時,返回的錯誤信息是"missing form body"。該信息已明確的說明錯誤是因為請求體為空造成的,所以不需要再額外的添加其他上下文信息。

使用示例2

以下代碼選擇源碼/src/net/http/transport.go的部分,當請求體中的url地址為nil返回的錯誤:"http: nil Request.URL" ,說明是請求中的URL字段為nil。以及當Header為nil返回的錯誤:"http:nil Request.Header",說明請求體中的Header字段為nil。

error.New使用場景2 :

將errors.New創建的錯誤賦值給一個全局的變量,我們稱該變量為哨兵錯誤,該哨兵錯誤變量可以在被處理的時候使用 == 或 errors.Is來進行值的比較。

使用示例 : 在源碼/src/io/io.go中定義的代表文件末尾的哨兵錯誤變量EOF。

在beego項目中,beego/core/utils/file.go文件中有這樣的應用,當讀取文件時,遇到的錯誤不是文件末尾的錯誤則直接返回,如果遇到的是文件末尾的錯誤,則中斷for循環,說明文件已經讀完文件中的所有內容了。如下:

2.2 通過fmt.Errorf方法創建

使用場景1:不帶%w占位符 :

在創建錯誤的時候,不能通過errors.New創建的字符串信息來描述錯誤,而需要通過占位符添加更多的上下文信息,即動態信息。

使用示例:不帶%w占位符 :

以下示例節選自gorm/schema/relationship.go的部分代碼,當外鍵不合法時,通過fmt.Errorf("invalid foreign key:%s", foreignKey)返回帶具體外鍵的錯誤。因為外鍵值是在運行時才能確定的。代碼如下:

使用場景2:帶%w的占位符 :

在有些場景下,調用者需要知道原始錯誤信息,一般會通過errors.Is函數進行判斷該錯誤鏈中是否包含某種特定類型的原始錯誤值。

使用%w占位符創建的錯誤信息,其實會形成一個錯誤鏈。其用法如下:

我們再來看下源代碼:

通過源碼可知,如果fmt.Errorf中包含%w占位符,創建的是一個wrapError結構體類型的值。我們再來看下wrapError結構體的定義:

字段err就是原始錯誤,msg是經過格式化之后的錯誤信息。

使用示例:帶%w的占位符 :

假設我們有一個從數據庫查詢合同的函數,當從數據庫中查詢到記錄為空時,會返回一個sql.ErrNoRows錯誤,我們用%w占位符來wrap該錯誤,并返回給調用者。

好了,現在GetContract的調用者可以知道原始的錯誤信息了。在調用者邏輯中我們可以使用errors.Is來判斷err中是否包含sql.ErrNoRows值了。我們看下調用者的代碼:

使用場景 :這個是相對errors.New來說的,errors.New適用于對可預知的錯誤的定義。而當發生了不可預知的錯誤時,就需要自定義錯誤類型了。

使用示例 : 我們以go源碼/src/io/fs/fs.go文件中的源碼為例,來看下自定義錯誤類型都需要包含哪些元素。

首先看結構體,有一個error接口類型的Err,這個代表的是錯誤源,因為根據上面講解的,在錯誤層層傳遞返回給調用者時,我們需要追蹤每一層的原始錯誤信息,所以需要該字段對error進行wrap,形成錯誤鏈。另外,有兩個字段Op和Path,分別代表是產生該錯誤的操作和操作的路徑。這兩個字段就是所謂的未預料到的錯誤:不確定是針對哪個路徑做了什么錯誤引發了該錯誤。

我們看下該錯誤類型在代碼中的應用:

應用1 :在go的文件src/embed/embed.go中的代碼,當讀取某目錄時返回的一個PathError類型的錯誤,代表讀取該目錄操作時,因為是一個目錄,所以不能直接讀取文件內容。

應用2 :在go的文件src/embed/embed.go中的代碼中,有文件讀取的函數,當offset小于0時,返回了一個PathError,代表是在讀取該文件的時候,參數不正確。

fs.ErrInvalid的定義如下:

由此可見,PathError中的三個字段值都是不可預知的,都需要在程序運行時才能具體決定的,所以這種場景時,則需要自定義錯誤類型。

另外,我們還注意到該自定義的類型中有Unwrap函數的實現,該函數主要是為了配合errors.Is和errors.As使用的,因為這兩個函數在使用時是將錯誤鏈層層解包一一比對的。

根據上一節我們得到,通過%w占位符可以將錯誤組織成一個錯誤鏈。

errors.Is函數就是來判斷錯誤鏈中有沒有和指定的錯誤值相等的錯誤,相等于 == 操作符 。注意,這里是特定的錯誤值,就像gorm中定義的ErrRecordNotFound這樣:

那么我們就可以這樣使用errors.Is:

errors.As函數,這個函數是用來檢查錯誤鏈中的錯誤是否是特定的類型 。如下代碼示例是節選自etcd項目中etcd/server/embed/config_logging.go中的部分代碼,代表的是err鏈中有沒有能當做json.SyntaxError類型的錯誤的,如果能,則將err中的錯誤值賦值到syntaxError變量上,代碼如下:

本文從應用場景的角度講解了各種創建錯誤方式的實際應用場景。示例中的代碼盡量的選自golang源碼或開源項目。 同時,每種的應用場景并非絕對的,需要靈活應用。希望本文對大家在實際使用中能夠有所幫助。

golang中http請求體多次讀取的坑

報錯信息如下:

[logid: 3628171316][json.err: EOF] [exception:EOF] goroutine 20521 [running]:

原因:

在請求體為json的請求中,調用了parsePostForm方法,方法大致內容如下:

在這個方法中,會讀取http的請求體。

在這里被讀取的時候,后面又重新讀取一次,之后解json

后面讀到的請求體是空的,解json的時候就會報錯EOF

總結:golang中http請求報錯eof,多半是因為多次讀取了請求體

golang-gin框架參數解析

g.GetHeader("token")

g.Request.Header.Get("token")

h := HeaderParam{}?

g.ShouldBindHeader(h)? ? ? ? ? ?//使用結構體可以解析,map無效

如:測試

g.DefaultQuery("test","")

g.Query("test")

g.Request.URL.Query().Get("test")

//text類型參數

formP,ok := g.GetPostForm("test")

formP := g.DefaultPostForm("test","")

formP :=g.Request.PostForm.Get("test")

//file類型

file,err := r.FormFile("file")? ? //單個

//多個formData解析

formDatas,err := r.MultipartForm()

if err !=nil formDatas !=nil {

files := formDatas.File["files"]

textParams := formDatas.Value["params"]

}

數據解析,同一個參數,只可調用一次,不然會EOF

1、定義結構體解析

uploadInfo :=model.UploadInfo{}

err := c.ShouldBindJSON(uploadInfo)

2、可用map解析出來后再遍歷

uploadInfo?:= make(map[string]interface{})

err := c.ShouldBindJSON(uploadInfo)

當前文章:go語言posteof go語言post請求
網站鏈接:http://vcdvsql.cn/article24/hehjje.html

成都網站建設公司_創新互聯,為您提供建站公司企業網站制作電子商務網頁設計公司品牌網站設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設