feat(Go-StudyExample):2021/02/09:新增merge源码阅读和单测代码

This commit is contained in:
Huangzj
2021-02-09 16:00:31 +08:00
parent 05f55b0eac
commit cf02f0bf10
51 changed files with 3712 additions and 1 deletions
+66
View File
@@ -0,0 +1,66 @@
/*
* @Author : huangzj
* @Time : 2021/2/2 11:37
* @Description
*/
package merge
import (
"fmt"
"log"
"testing"
"github.com/imdario/mergo"
)
type redisConfig struct {
Address string
Port int
DB int
}
var defaultConfig = redisConfig{
Address: "127.0.0.1",
Port: 6381,
DB: 1,
}
//基础使用,如果被merge的对象字段有值则不覆盖
func TestBaseUse(t *testing.T) {
var config redisConfig
if err := mergo.Merge(&config, defaultConfig); err != nil {
log.Fatal(err)
}
fmt.Println("redis address: ", config.Address)
fmt.Println("redis port: ", config.Port)
fmt.Println("redis db: ", config.DB)
var m = make(map[string]interface{})
if err := mergo.Map(&m, defaultConfig); err != nil {
log.Fatal(err)
}
fmt.Println(m)
}
//测试字段覆盖
func TestOverride(t *testing.T) {
var config redisConfig
if err := mergo.Merge(&config, defaultConfig); err != nil {
log.Fatal(err)
}
fmt.Println("redis address: ", config.Address)
fmt.Println("redis port: ", config.Port)
fmt.Println("redis db: ", config.DB)
var m = make(map[string]interface{})
if err := mergo.Merge(&config, defaultConfig, mergo.WithOverride); err != nil {
log.Fatal(err)
}
fmt.Println(m)
}
+41
View File
@@ -0,0 +1,41 @@
/*
* @Author : huangzj
* @Time : 2021/2/3 9:50
* @Description
*/
package merge
import (
"fmt"
"github.com/imdario/mergo"
"log"
"testing"
)
type redisConfig2 struct {
Address string
Port int
DBs []int
}
var defaultConfig2 = redisConfig2{
Address: "127.0.0.1",
Port: 6381,
}
// 前提:需要配置 WithOverride 一起使用
// WithOverrideEmptySlice 空数组覆盖
// WithOverwriteWithEmptyValue 空字段、空数组覆盖
func TestNilOverride(t *testing.T) {
var config redisConfig2
config.DBs = []int{2, 3}
if err := mergo.Merge(&config, defaultConfig2, mergo.WithOverride, mergo.WithOverrideEmptySlice); err != nil {
log.Fatal(err)
}
fmt.Println("redis address: ", config.Address)
fmt.Println("redis port: ", config.Port)
fmt.Println("redis dbs: ", config.DBs)
}
+11
View File
@@ -0,0 +1,11 @@
参考地址:[https://segmentfault.com/a/1190000021997004](https://segmentfault.com/a/1190000021997004)
工程地址:[https://github.com/imdario/mergo](https://github.com/imdario/mergo)
获取方式:go get github.com/imdario/mergo
注意事项
mergo不会赋值非导出字段;
map中对应的键名首字母会转为小写;
mergo可嵌套赋值,我们演示的只有一层结构。
+54
View File
@@ -0,0 +1,54 @@
/*
* @Author : huangzj
* @Time : 2021/2/2 11:49
* @Description
*/
package merge
import "testing"
import (
"fmt"
"log"
"github.com/imdario/mergo"
)
type redisConfig1 struct {
Address string
Port int
DBs []int
}
var defaultConfig1 = redisConfig1{
Address: "127.0.0.1",
Port: 6381,
DBs: []int{1},
}
func TestAppend(t *testing.T) {
var config redisConfig1
config.DBs = []int{2, 3}
if err := mergo.Merge(&config, defaultConfig1, mergo.WithAppendSlice); err != nil {
log.Fatal(err)
}
fmt.Println("redis address: ", config.Address)
fmt.Println("redis port: ", config.Port)
fmt.Println("redis dbs: ", config.DBs)
}
func TestNotAppend(t *testing.T) {
var config redisConfig1
config.DBs = []int{2, 3}
if err := mergo.Merge(&config, defaultConfig1); err != nil {
log.Fatal(err)
}
fmt.Println("redis address: ", config.Address)
fmt.Println("redis port: ", config.Port)
fmt.Println("redis dbs: ", config.DBs)
}
+42
View File
@@ -0,0 +1,42 @@
/*
* @Author : huangzj
* @Time : 2021/2/3 9:59
* @Description
*/
package merge
import (
"fmt"
"github.com/imdario/mergo"
"log"
"testing"
)
func TestWithoutTypeCheck(t *testing.T) {
m1 := make(map[string]interface{})
m1["dbs"] = []uint32{2, 3}
m2 := make(map[string]interface{})
m2["dbs"] = []int{1}
if err := mergo.Map(&m1, &m2, mergo.WithOverride); err != nil {
log.Fatal(err)
}
fmt.Println(m1)
}
func TestWithTypeCheck(t *testing.T) {
m1 := make(map[string]interface{})
m1["dbs"] = []uint32{2, 3}
m2 := make(map[string]interface{})
m2["dbs"] = []int{1}
if err := mergo.Map(&m1, &m2, mergo.WithOverride, mergo.WithTypeCheck); err != nil {
log.Fatal(err)
}
fmt.Println(m1)
}