昨天在測試乙個小遊戲登入模組功能的時候,編寫乙個json繫結的對映。一般在反序列化的時候會加上錯誤判斷這也變成了習慣性的動作。但隨後發現對這種判斷還存在一些誤解的地方。
看以下的**說明。
package main
import (
"fmt"
"encoding/json"
)type loginvo struct
func main() `)
var loginvo loginvo
err := json.unmarshal(jsonstr,&loginvo)
if err!=nil
fmt.printf("%+v",loginvo)
}
//以下是輸出結果
hello, world!
正常情況下,這個繫結的結果和預期符合。loginvo的值通過序列化賦值進來。
但隨後因為測試日誌功能,故意把json的一段**字段調整。將原先的openid值更改一下。
var jsonstr = byte(``)
測試的結果如下:
hello, world!
**依舊可以通過,但並沒有發生丟擲錯誤。這個時候就覺得奇怪
繼續把json的字串調整非法json結構的時候,故意不加逗號
var jsonstr = byte(``)
編譯後,會輸出日誌錯誤
hello, world!
error: invalid character
'"'after object key:value pair
實際上,通過以上測試,一直誤以為json.unmarshal 操作的時候,將結構體loginvo對映賦值過如果不成功會丟擲出錯,事實上並不是。正常的json字串,通過反序列化後依舊可以不丟擲錯誤,只是說沒有正常賦值給需要的結構體。
err :=json.unmarshal(jsonstr,&loginvo)
最後想當然以為通過序列化可以判斷這個值是否有效,看來還要判斷一下這個結構體的值是否為空才能判斷。
package main
import (
"fmt"
"encoding/json"
)type loginvo struct
func main() `)
var loginvo loginvo
err := json.unmarshal(jsonstr,&loginvo)
if err!=nil
if loginvo.openid ==""
fmt.printf("%+v",loginvo)
}
不知道還有沒有存在其他的坑呢 Go學習筆記
使用關鍵字var定義變數,自動初始化為零值。如果提供初始化值,可省略變數型別。在函式內部,可用更簡略的 方式定義變數。空白符號 package main import fmt func test 2,0 函式內部 定義變數陣列data 0 data 1 data 2 並賦值0,1,2,且i 0 i,...
go學習筆記
那些打不倒你的,終將讓你變的更強 package main import fmt func main 輸出結果 num1的型別是 int,數值是 30 num2的型別是 int,數值是 40 name的型別是 string,數值是 zhangshang sum的型別是 int,數值是 30 1 2 ...
Go學習筆記
go語言型別宣告語句 一 宣告變數 var 基本資料型別 1.整型 基礎型別 變數的宣告 變數的字面值為整型 var a int 自動初始化為0 變數的賦值 a 100 var b 200 隱式宣告變數並初始化 var c int 300 顯式宣告型別的變數 d 400 自動推導變數的型別 w,z ...