feat(Go-StudyExample):2020/12/31:新增【Go每日一库】go-cmp结构体比较工具
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2020/12/30 15:21
|
||||
* @Description:测试未导出字段
|
||||
*/
|
||||
|
||||
package go_cmp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/google/go-cmp/cmp/cmpopts"
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
//自定义是否比较未导出字段,这个方法和上面的很类似,都是必须制定相应的结构体
|
||||
func TestDiyExportMethod(t *testing.T) {
|
||||
u1 := User2{"dj", 18, Address{}}
|
||||
u2 := User2{"dj", 18, Address{}}
|
||||
|
||||
fmt.Println("u1 equals u2?", cmp.Equal(u1, u2, cmp.Exporter(allowUnExportedInType)))
|
||||
}
|
||||
|
||||
//测试只忽略当前对象的未导出属性
|
||||
func TestExportOne(t *testing.T) {
|
||||
c1 := Contactx{Phone: "123456789", Email: "dj@example.com"}
|
||||
c2 := Contactx{Phone: "123456789", Email: "dj@example.com"}
|
||||
|
||||
u1 := Userx{"dj", 18, c1}
|
||||
u2 := Userx{"dj", 18, c2}
|
||||
|
||||
//i think 通过 IgnoreUnexported 这个属性可以实现忽略具体类型的未导出字段,但是好像没办法忽略 【指针类型】 的未导出字段
|
||||
fmt.Println("u1 equals u2?", cmp.Equal(u1, u2, cmpopts.IgnoreUnexported(Userx{})))
|
||||
}
|
||||
|
||||
//结构体中有未导出字段的时候,通过Equal进行比较的时候,会报错,除非设置忽略
|
||||
func TestExportError(t *testing.T) {
|
||||
c1 := &Contact1{Phone: "123456789", Email: "dj@example.com"}
|
||||
c2 := &Contact1{Phone: "123456789", Email: "dj@example.com"}
|
||||
|
||||
u1 := User1{"dj", 18, c1}
|
||||
u2 := User1{"dj", 18, c2}
|
||||
|
||||
fmt.Println("u1 equals u2?", cmp.Equal(u1, u2))
|
||||
}
|
||||
|
||||
//使用 【IgnoreUnexported】,但是在结构体下层还有其他非导出的字段也会报错,这个字段没办法深入到里面
|
||||
func TestExportError2(t *testing.T) {
|
||||
u11 := User2{"dj", 18, Address{}}
|
||||
u22 := User2{"dj", 18, Address{}}
|
||||
|
||||
fmt.Println("u1 equals u2?", cmp.Equal(u11, u22, cmpopts.IgnoreUnexported(User2{})))
|
||||
}
|
||||
|
||||
func allowUnExportedInType(t reflect.Type) bool {
|
||||
if t.Name() == "Address" {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
type Contactx struct {
|
||||
Phone string
|
||||
Email string
|
||||
}
|
||||
|
||||
type Userx struct {
|
||||
Name string
|
||||
Age int
|
||||
contact Contactx //注意这边是结构体
|
||||
}
|
||||
|
||||
type Contact1 struct {
|
||||
Phone string
|
||||
Email string
|
||||
}
|
||||
|
||||
type User1 struct {
|
||||
Name string
|
||||
Age int
|
||||
contact *Contact1
|
||||
}
|
||||
|
||||
type Address struct {
|
||||
Province string
|
||||
city string
|
||||
}
|
||||
|
||||
type User2 struct {
|
||||
Name string
|
||||
Age int
|
||||
Address Address
|
||||
}
|
||||
Reference in New Issue
Block a user