wip: 保存 Go 练习和技术笔记
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
// 引入两个包进行对比
|
||||
jsonV1 "encoding/json"
|
||||
jsonV2 "encoding/json/v2"
|
||||
)
|
||||
|
||||
func TestV2Null(t *testing.T) {
|
||||
type Product struct {
|
||||
Name string `json:"name"`
|
||||
Tags []string `json:"tags"`
|
||||
}
|
||||
p := Product{
|
||||
Name: "product1",
|
||||
}
|
||||
data1, _ := jsonV1.Marshal(p)
|
||||
data2, _ := jsonV2.Marshal(p)
|
||||
t.Log(string(data1))
|
||||
t.Log(string(data2))
|
||||
}
|
||||
|
||||
func TestOmitZeroVsEmpty(t *testing.T) {
|
||||
// ===== V1 结构体:使用 omitempty =====
|
||||
type EventV1 struct {
|
||||
Title string `json:"title"`
|
||||
CreatedAt time.Time `json:"created_at,omitempty"` // ⚠️ omitempty 对 time.Time 无效
|
||||
}
|
||||
|
||||
// ===== V2 结构体:使用 omitzero =====
|
||||
type EventV2 struct {
|
||||
Title string `json:"title"`
|
||||
CreatedAt time.Time `json:"created_at,omitzero"` // ✅ omitzero 能识别 IsZero()
|
||||
}
|
||||
// 都不给 CreatedAt 赋值,保持 Go 的零值 time.Time{}
|
||||
|
||||
// 1. 测试 v1 + omitempty
|
||||
e1 := EventV1{Title: "Go Meetup"}
|
||||
data1, _ := jsonV1.Marshal(e1)
|
||||
fmt.Println("v1 + omitempty 输出:", string(data1))
|
||||
|
||||
// 2. 测试 v2 + omitzero
|
||||
e2 := EventV2{Title: "Go Meetup"}
|
||||
data2, _ := jsonV2.Marshal(e2)
|
||||
fmt.Println("v2 + omitzero 输出:", string(data2))
|
||||
}
|
||||
|
||||
func TestMultiStyle(t *testing.T) {
|
||||
type MultiStyleUser struct {
|
||||
// 1. 严格匹配:JSON key 必须精确是 "user_id"
|
||||
ID string `json:"user_id,case:strict"`
|
||||
|
||||
// 2. 忽略大小写:JSON key 是 "Name"、"NAME"、"name" 都能成功赋值
|
||||
Name string `json:"name,case:ignore"`
|
||||
}
|
||||
// 假设第三方传来的 JSON 风格混杂
|
||||
jsonData := []byte(`{
|
||||
"user_id": "1001",
|
||||
"NAME": "Gopher"
|
||||
}`)
|
||||
var m MultiStyleUser
|
||||
jsonV2.Unmarshal(jsonData, &m)
|
||||
t.Log(m)
|
||||
}
|
||||
Reference in New Issue
Block a user