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