ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะต้องชี้ให้เห็นและรู้ว่าหากชิ้นส่วนปลายทาง (ชิ้นส่วนที่คุณผนวกไว้) มีความจุเพียงพอส่วนผนวกจะเกิดขึ้น "แบบแทนที่" โดยทำการติดตั้งปลายทางใหม่อีกครั้ง (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และซึ่งแตกต่างจากya
append()ฟังก์ชัน Variadic และ...ให้คุณส่งอาร์กิวเมนต์หลาย ๆ ตัวไปยังฟังก์ชัน Variadic จากชิ้น