copier 0.3.5 -> 0.4.0 的变化

背景

最近在使用 jinzhu 大佬的库,从 0.3.5 升级到 0.4.0 之后发现有一些特性被改变了。原本用 == nil 判断的地方现在不通过了。

场景

一个很简单的场景,把 a 切片转换为 b 切片,然后判断 b 是否为 nil

func main() {
	var (
		a []*A
		b []*B
	)
	err := copier.Copy(&b, &a)
	if err != nil {
		panic(err)
	}

	if b == nil {
		fmt.Println("b nil")
		return
	}
	fmt.Println("not nil")
}

在 0.3.5 的版本中,会打印 nil。但是在 0.4.0 的场景中会打印 not nil。所以就会导致原本用 == nil 判断的地方,现在不行了。

原理

翻了翻大佬的合并记录,发现了这么一个 mr。
Merge pull request #164 from hhh111119/fix_empty_slice_to_nil · jinzhu/copier@0e264e9

在这里插入图片描述

里面修改了这么一段,把 179 行的 fromType.ConvertibleTo(toType) 这个判断从 if 判断中里面移到 if 里面了。
按照原来的逻辑,测试代码是走不到这个 if 里面的,不会走 to.Set(slice) 这一段,所以返回的就是 nil。
在新的逻辑中,无论是否可以转换,都会走到这个 if 里面,然后把 to 设置成切片再返回。
这就导致了两个版本的差异。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值