2022-10-28:以下go语言代码输出什么?A:false false;B:true false
2022-10-28:以下go语言代码输出什么?A:false false;B:true false;C:true true;D:false true。
package main
import "fmt"
func main() {
s := []string{"A", "B", "C"}
t := s[:1]
fmt.Println(&s[0] == &t[0])
u := append(s[:1], s[2:]...)
fmt.Println(&s[0] == &u[0])
}
答案选C。这里的关键点是 append(s[:1], s[2:]…) 会不会导致扩容。s[:1] 相当于 s[3],即容量是也是 3,因此 append 一个元素(s[2:]…)并不会导致扩容,因此第一个元素还是原来 s[0] 的元素。
本作品采用《CC 协议》,转载必须注明作者和本文链接
会输出
[A] true [A C] true
append 是个巨坑。看到返回给了一个新变量,以为会重新分配一个底层数组,实际并没有。u和s 会指向同一个底层数组,然后 s[2:]... 实际上只有一个元素 c 。append 会修改底层数组第二个元素为 C,这样 s 也被改变了。 [A B C] ----> [A C C]。 u 为 [AC]