b = append(b[:1], b...) 为什么能右移?

lysShub · 2025-3-6 13:50:48 · 518 次点击
func TestXxxx(t *testing.T) {
	var b = make([]byte, 128, 512)
	rand.Read(b)

	b1 := slices.Clone(b)
	b = append(b[:1], b...)
	b2 := b[1:]

	require.Equal(t, b1, b2)

	ptr := uintptr(unsafe.Pointer(unsafe.SliceData(b)))
	ptr2 := uintptr(unsafe.Pointer(unsafe.SliceData(b2)))
	require.Equal(t, ptr+1, ptr2)
}

第一步:把 b[0]放入 b[1], 这没问题

第二步:把 b[1]放入 b[2], 可是这是的 b[1]在第一步被覆盖了,这样推导下去,整个 b[i]都会变为 b[0] ?

举报· 518 次点击
登录 注册 站外分享
4 条回复  
NouveauNom 小成 2025-3-6 13:52:21
楼下注意不要粘贴 ai 回答,避免 ai 警察。谢谢我吧。
MoYi123 小成 2025-3-6 13:53:59
我觉得大概率是编译成 memmove 了.
lysShub 楼主 小成 2025-3-6 14:04:41
@MoYi123 看了下汇编,确实有 memmove
my3157 小成 2025-3-6 14:24:25
和前面的没啥关系, b 和 b2 本来就是引用了同一个底层数组的不同位置而已 b = append(b[:1], b...) b2 := b[1:]
返回顶部