回答

收藏

删除切片中的元素

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

    func main()      a := []string{"Hello1","Hello2","Hello3"}    fmt.Println(a)    // [Hello1 Hello2 Hello3]    a = append(a[:0],a[1:]...)    fmt.Println(a)    // [Hello2 Hello3]}
    , G: j$ [! u! A3 a) `7 L) t
这个带有 append 函数删除技巧是如何工作的?
7 q4 {7 B4 ~: i; z6 D( [在第一个元素(空数组)之前,它似乎抓住了所有的内容
0 e2 y7 a1 w) f3 ?. J, V# s然后在第一个元素之后添加所有内容(零位置)7 v/ j1 N% s& w. Q$ w
…(点点点点)有什么作用?
7 m" r. b* v. J( l+ |, h+ [0 |                                                               
! v. e4 n- R+ @7 P/ k3 u    解决方案:                                                               
8 t  E) C$ N( b8 a% S, i! h                                                                a切片在哪里,i索引要删除的元素:& X7 K# Q# t- T6 k( D. [
    a = append(a[:i],a[i 1:]...)
    # ?+ f6 Y2 N) B7 Q) `$ ^& e" Y9 o
... 是 Go 可变参数语法。- v/ u: z5 J5 U. i. G- L1 R7 ?4 ]
基本上,在定义当一个函数时,它会将您传递的所有参数放入该类型的切片中。通过这样做,您可以传递任何数量的参数(例如,fmt.Println任意数量的参数都可以使用)。* G9 r. i7 w3 R% v
现在,当调用一个函数,...相反:它解压一个切片,并将其作为单独的参数传递给可变参数函数。5 L5 M9 N+ _8 R, q9 S3 ~6 V
这条线的作用是:0 y  n7 F3 g' D
    a = append(a[:0],a[1:]...)
    . y* C7 c: U+ L
本质上是:
7 v8 I* }$ q" G2 V5 y& |
    a = append(a[:0],a[1],a[2])( t7 S3 G5 Y" N% B9 g$ e
现在,你可能想知道为什么不直接做! q3 I5 ^3 w6 h
    a = append(a[1:]...)- K5 i, p0 J8 d7 L0 t
然后,函数定义append是
, n: H$ k8 D! v( X3 \3 i9 o
    func append(slice []Type,elems ...Type) []Type
    - `7 @1 O! M5 {1 `) K  @/ U
因此,第一个参数必须是正确类型的切片,第二个参数是可变参数,因此我们输入空切片,然后减压切片的其余部分来填充参数。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则