背景
最近在使用 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 设置成切片再返回。
这就导致了两个版本的差异。