Files

96 lines
2.2 KiB
Go

/*
* @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
}