ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะต้องชี้ให้เห็นและรู้ว่าหากชิ้นส่วนปลายทาง (ชิ้นส่วนที่คุณผนวกไว้) มีความจุเพียงพอส่วนผนวกจะเกิดขึ้น "แบบแทนที่" โดยทำการติดตั้งปลายทางใหม่อีกครั้ง (reslicing เพื่อเพิ่มความยาว สามารถรองรับองค์ประกอบที่ต่อท้ายได้)
ซึ่งหมายความว่าหากปลายทางถูกสร้างขึ้นโดยการแบ่งอาร์เรย์หรือส่วนที่ใหญ่กว่าซึ่งมีองค์ประกอบเพิ่มเติมเกินกว่าความยาวของชิ้นส่วนผลลัพธ์พวกเขาอาจถูกเขียนทับ
ในการสาธิตดูตัวอย่างนี้:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
เอาท์พุท (ลองไปที่สนามเด็กเล่น Go ):
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 10
x: [1 2 3 4]
a: [1 2 3 4 0 0 0 0 0 0]
เราได้สร้าง "สนับสนุน" อาร์เรย์ที่มีความยาวa
10
จากนั้นเราก็สร้างx
ชิ้นปลายทางโดยหั่นนี้a
อาร์เรย์ชิ้นจะถูกสร้างขึ้นโดยใช้ตัวอักษรคอมโพสิตy
[]int{3, 4}
ตอนนี้เมื่อเราผนวกy
เพื่อx
ผลที่ได้คือความคาดหวัง[1 2 3 4]
แต่สิ่งที่อาจจะน่าแปลกใจคืออาร์เรย์สนับสนุนa
ยังมีการเปลี่ยนแปลงเนื่องจากความจุของx
มีที่10
ซึ่งเพียงพอที่จะผนวกy
กับมันจึงx
เป็น resliced ซึ่งจะใช้เหมือนกันa
อาร์เรย์การสนับสนุนและappend()
จะคัดลอกองค์ประกอบของy
ไปที่นั่น
หากคุณต้องการหลีกเลี่ยงปัญหานี้คุณอาจใช้นิพจน์ส่วนเต็มที่มีแบบฟอร์ม
a[low : high : max]
max - low
ซึ่งสร้างชิ้นและยังควบคุมกำลังการผลิตชิ้นส่งผลโดยการตั้งค่าให้
ดูตัวอย่างที่แก้ไข (ความแตกต่างเพียงอย่างเดียวคือเราสร้างx
สิ่งนี้x = a[:2:2]
:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
เอาท์พุท (ลองไปที่สนามเด็กเล่นไป )
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 2
x: [1 2 3 4]
a: [1 2 0 0 0 0 0 0 0 0]
อย่างที่คุณเห็นเราได้รับx
ผลลัพธ์เดียวกันแต่อาเรย์สำรองa
ไม่เปลี่ยนแปลงเนื่องจากความสามารถในการx
เป็น "เท่านั้น" 2
(ด้วยการแสดงออกเต็มส่วนa[:2:2]
) ดังนั้นจะทำอย่างไรผนวก, อาร์เรย์สนับสนุนใหม่มีการจัดสรรที่สามารถเก็บองค์ประกอบของทั้งสองx
และซึ่งแตกต่างจากy
a
append()
ฟังก์ชัน Variadic และ...
ให้คุณส่งอาร์กิวเมนต์หลาย ๆ ตัวไปยังฟังก์ชัน Variadic จากชิ้น