初始化项目

This commit is contained in:
皮蛋13361098506
2025-01-06 16:01:02 +08:00
commit 1b77f62820
575 changed files with 69193 additions and 0 deletions

View File

@@ -0,0 +1,78 @@
package jsonUtil
import (
"encoding/json"
"strings"
)
// 使用Number类型来反序列化字符串
// 当被序列化为interface{}类型时如果int型的长度大于7则会被使用科学计数法进行表示
// 当反序列化时会无法转换为int类型会导致错误
// 所以需要使用Number类型
// s:输入字符串
// 返回值:
// 反序列化后的数据
// 错误对象
func UnMarshalWithNumberType(s string) (interface{}, error) {
// 构造decode对象
var decode = json.NewDecoder(strings.NewReader(s))
decode.UseNumber()
// decode
var result interface{}
if err := decode.Decode(&result); err != nil {
return nil, err
}
return result, nil
}
// 深拷贝对象
// src:源数据
// 返回值:
// 新对象
// 错误对象
func DeepClone(src interface{}) (interface{}, error) {
var byteSlice []byte
var err error
// 先序列化为[]byte
if byteSlice, err = json.Marshal(src); err != nil {
return nil, err
}
// 再反序列化成对象
var result interface{}
if err := json.Unmarshal(byteSlice, &result); err != nil {
return nil, err
}
return result, nil
}
// 使用Number类型来深拷贝对象
// src:源数据
// 返回值:
// 新对象
// 错误对象
func DeepCloneWithNumberType(src interface{}) (interface{}, error) {
var byteSlice []byte
var err error
// 先序列化为[]byte
if byteSlice, err = json.Marshal(src); err != nil {
return nil, err
}
// 构造decode对象
var decode = json.NewDecoder(strings.NewReader(string(byteSlice)))
decode.UseNumber()
// decode
var result interface{}
if err := decode.Decode(&result); err != nil {
return nil, err
}
return result, nil
}

View File

@@ -0,0 +1,131 @@
package jsonUtil
import (
"encoding/json"
"fmt"
"testing"
)
func TestUnMarshalWithNumberType(t *testing.T) {
src := make(map[string]int)
src["Name"] = 123
src["Money"] = 100000000
var byteSlice []byte
var err error
if byteSlice, err = json.Marshal(src); err != nil {
t.Errorf("Marshal src failed\n")
}
if target_interface, err := UnMarshalWithNumberType(string(byteSlice)); err != nil {
t.Errorf("Expected got nil, but got err:%s\n", err)
} else {
if target_map, ok := target_interface.(map[string]interface{}); !ok {
t.Errorf("Expected got nil, but got err:%s\n", err)
} else {
money, ok := target_map["Money"].(json.Number)
money_int, err := money.Int64()
if !ok || err != nil || money_int != 100000000 {
t.Errorf("Expected got 100000000, but got %v, ok:%v, err:%s\n", money_int, ok, err)
}
fmt.Printf("target_map:%v\n", target_map)
}
}
intSlice1 := []int{1, 2, 3, 5}
if byteSlice, err = json.Marshal(intSlice1); err != nil {
t.Errorf("Marshal src failed\n")
}
if target_interface, err := UnMarshalWithNumberType(string(byteSlice)); err != nil {
t.Errorf("Expected got nil, but got err:%s\n", err)
} else {
fmt.Printf("target_interface:%v\n", target_interface)
if target_slice, ok := target_interface.([]interface{}); !ok {
t.Errorf("Expected got []int, but failed.\n")
} else {
fmt.Printf("target_slice:%v\n", target_slice)
}
}
}
func TestDeepClone(t *testing.T) {
p1 := NewPlayer(100000000, "Jordan")
if p1_map, err := DeepClone(p1); err != nil {
t.Errorf("Expected nil, but got err:%s", err)
} else {
fmt.Printf("p1:%s\n", p1)
before := fmt.Sprintf("%v", p1_map)
p1.Name = "Jordan Zuo"
fmt.Printf("p1:%s\n", p1)
after := fmt.Sprintf("%v", p1_map)
fmt.Printf("before:%s\n", before)
fmt.Printf("after:%s\n", after)
if before != after {
t.Errorf("Expected before and after same, but got different")
}
}
intSlice1 := []int{1, 2, 3, 5}
if intSlice2_interface, err := DeepClone(intSlice1); err != nil {
t.Errorf("Expected nil, but got err:%s", err)
} else {
fmt.Printf("intSlice1:%v\n", intSlice1)
before := fmt.Sprintf("%v", intSlice2_interface)
intSlice1 = append(intSlice1, 10)
fmt.Printf("intSlice1:%v\n", intSlice1)
after := fmt.Sprintf("%v", intSlice2_interface)
fmt.Printf("before:%s\n", before)
fmt.Printf("after:%s\n", after)
if before != after {
t.Errorf("Expected before and after same, but got different")
}
}
}
func TestDeepCloneWithNumberType(t *testing.T) {
p1 := NewPlayer(100000000, "Jordan")
if p1_interface, err := DeepCloneWithNumberType(p1); err != nil {
t.Errorf("Expected nil, but got err:%s", err)
} else {
if p1_map, ok := p1_interface.(map[string]interface{}); !ok {
t.Errorf("Expected nil, but got err:%s", err)
} else {
fmt.Printf("p1:%s\n", p1)
before := fmt.Sprintf("%v", p1_map)
p1.Name = "Jordan Zuo"
fmt.Printf("p1:%s\n", p1)
after := fmt.Sprintf("%v", p1_map)
fmt.Printf("before:%s\n", before)
fmt.Printf("after:%s\n", after)
if before != after {
t.Errorf("Expected before and after same, but got different")
}
fmt.Printf("p1_interface_map:%v\n", p1_map)
id, ok := p1_map["Id"].(json.Number)
id_int, err := id.Int64()
if !ok || err != nil || id_int != 100000000 {
t.Errorf("Expected got 100000000, but got %v, ok:%v, err:%s\n", id_int, ok, err)
}
}
}
}
type Player struct {
Id int
Name string
}
func (player *Player) String() string {
return fmt.Sprintf("{Addr:%v, Id:%v, Name:%s}", &player, player.Id, player.Name)
}
func NewPlayer(id int, name string) *Player {
return &Player{
Id: id,
Name: name,
}
}