补充“slice可以包含自身”的场景

This commit is contained in:
Jun10ng 2020-04-23 23:34:18 +08:00
parent a0e3fc36ee
commit ded9925bbc

View File

@ -95,7 +95,7 @@ func equal(x, y []string) bool {
} }
``` ```
上面关于两个slice的深度相等测试运行的时间并不比支持==操作的数组或字符串更多但是为何slice不直接支持比较运算符呢这方面有两个原因。第一个原因一个slice的元素是间接引用的一个slice甚至可以包含自身。虽然有很多办法处理这种情形但是没有一个是简单有效的。 上面关于两个slice的深度相等测试运行的时间并不比支持==操作的数组或字符串更多但是为何slice不直接支持比较运算符呢这方面有两个原因。第一个原因一个slice的元素是间接引用的一个slice甚至可以包含自身译注当slice声明为[]interface{}时slice的元素可以是自身。虽然有很多办法处理这种情形,但是没有一个是简单有效的。
第二个原因因为slice的元素是间接引用的一个固定的slice值译注指slice本身的值不是元素的值在不同的时刻可能包含不同的元素因为底层数组的元素可能会被修改。而例如Go语言中map的key只做简单的浅拷贝它要求key在整个生命周期内保持不变性译注例如slice扩容就会导致其本身的值/地址变化。而用深度相等判断的话显然在map的key这种场合不合适。对于像指针或chan之类的引用类型==相等测试可以判断两个是否是引用相同的对象。一个针对slice的浅相等测试的==操作符可能是有一定用处的也能临时解决map类型的key问题但是slice和数组不同的相等测试行为会让人困惑。因此安全的做法是直接禁止slice之间的比较操作。 第二个原因因为slice的元素是间接引用的一个固定的slice值译注指slice本身的值不是元素的值在不同的时刻可能包含不同的元素因为底层数组的元素可能会被修改。而例如Go语言中map的key只做简单的浅拷贝它要求key在整个生命周期内保持不变性译注例如slice扩容就会导致其本身的值/地址变化。而用深度相等判断的话显然在map的key这种场合不合适。对于像指针或chan之类的引用类型==相等测试可以判断两个是否是引用相同的对象。一个针对slice的浅相等测试的==操作符可能是有一定用处的也能临时解决map类型的key问题但是slice和数组不同的相等测试行为会让人困惑。因此安全的做法是直接禁止slice之间的比较操作。