回答

收藏

为什么我不能用 `copy()` 复制切片?

技术问答 技术问答 170 人阅读 | 0 人回复 | 2023-09-12

我需要在 Go 制作切片副本并阅读文档,我可以使用复制功能。! A  V3 {( `3 k5 p" X8 C0 s
copy 内置函数将元素从源切片复制到目标切片。(作为一种特殊情况,它还将字节从字符串复制到字节切片。)源和目标可能会重叠。Copy 返回复制元素数,这将是 len(src) 和 len(dst) 中的最小值。
0 {) v. R5 O7 {6 ?; c: S: S
但当我这样做的时候:3 D/ ]* i& c4 w8 O7 l  d, s2 C' f
    arr := []int{1,2,3}tmp := []int{}copy(tmp,arr)fmt.Println(tmp)fmt.Println(arr)3 m2 D3 r+ g( s& {
我tmp的和以前一样是空的(我什至尝试使用arr,tmp):
6 Z- ]& d+ i( c1 ^2 ]# g# ~9 }
    [1 2 3]
    1 {. X( b) R& U) K5 m0 ]
你可以在 go playground查看。那我为什么不能复制切片呢?- V5 U. n# l, m
                                                               
2 z0 J( G4 [4 E  o9 V    解决方案:                                                               
6 ^5 j( x& k9 g8 |                                                                内置copy(dst,src)复制min(len(dst),len(src))元素。
9 a0 p5 {3 q0 g6 F. P8 w% s% E8 T' E所以,如果你的话dst空 ( len(dst) == 0),不复制任何内容。
/ T- |) J" ]2 ]3 v; O( L9 H8 w尝试tmp := make([]int,len(arr))(go):
9 s1 c2 j3 J5 _, n0 Q; Q
    arr := []int{1,2,3}tmp := make([]int,len(arr))copy(tmp,arr)fmt.Println(tmp)fmt.Println(arr)
    # |3 D9 O5 @/ o3 [1 y, {6 s
输出(如预期):7 X$ ^* S* X0 R* M# O! c6 }4 j7 l
    [1 2 3][1 2 3]
    " o9 r8 p1 P  Y$ @0 [% \/ l
不幸的是,这是builtin包里没有记录,但是在Go Language Specification: Appending to and copying slices 中有记录' g4 r) D2 R: _! ]+ A
复制元素的数量最小len(src)和len(dst)。
, j0 ^" E5 Y% W1 X编辑:
3 I6 u  b6 [  k2 q0 M. w最后,文档copy()已更新,包括最小长度的复制源和目标:' x0 z7 Z: c7 h
Copy 返回复制元素数,这将是len(src) 和 len(dst) 中的最小值
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则