go學習筆記(6)

2021-08-25 22:04:30 字數 1472 閱讀 8455

昨天在測試乙個小遊戲登入模組功能的時候,編寫乙個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 ...