ประเภทพารามิเตอร์นำหน้าด้วยจุดสามจุด ( ... ) เรียกว่าพารามิเตอร์ variadic นั่นหมายความว่าคุณสามารถส่งตัวเลขหรืออาร์กิวเมนต์ไปยังพารามิเตอร์นั้นได้ (เช่นเดียวกับfmt.Printf()
) ฟังก์ชันจะรับรายการอาร์กิวเมนต์สำหรับพารามิเตอร์เป็นชิ้นส่วนของประเภทที่ประกาศสำหรับพารามิเตอร์ ( []interface{}
ในกรณีของคุณ) ไปจำเพาะฯ :
พารามิเตอร์สุดท้ายในลายเซ็นฟังก์ชันอาจมีชนิดที่นำหน้าด้วย .... ฟังก์ชันที่มีพารามิเตอร์ดังกล่าวเรียกว่าตัวแปรและอาจเรียกใช้โดยมีอาร์กิวเมนต์เป็นศูนย์หรือมากกว่าสำหรับพารามิเตอร์นั้น
พารามิเตอร์:
a ...interface{}
คือสำหรับฟังก์ชันที่เทียบเท่ากับ:
a []interface{}
ความแตกต่างคือวิธีที่คุณส่งผ่านอาร์กิวเมนต์ไปยังฟังก์ชันดังกล่าว ทำได้โดยให้แต่ละองค์ประกอบของชิ้นงานแยกกันหรือเป็นชิ้นเดียวซึ่งในกรณีนี้คุณจะต้องต่อท้ายค่าชิ้นด้วยจุดสามจุด ตัวอย่างต่อไปนี้จะทำให้เกิดการเรียกเดียวกัน:
fmt.Println("First", "Second", "Third")
จะทำเช่นเดียวกับ:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
สิ่งนี้อธิบายได้ค่อนข้างดีในข้อกำหนดของGoเช่นกัน:
รับฟังก์ชั่นและการโทร
func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")
ภายในGreeting
, who
จะมีค่าnil
ในการโทรครั้งแรกและ[]string{"Joe", "Anna", "Eileen"}
ในครั้งที่สอง
ถ้าอาร์กิวเมนต์สุดท้ายคือมอบหมายประเภทชิ้น[]T
ก็อาจจะผ่านการเปลี่ยนแปลงเป็นค่าสำหรับพารามิเตอร์ถ้าอาร์กิวเมนต์ที่ถูกตามมาด้วย...T
...
ในกรณีนี้จะไม่มีการสร้างชิ้นส่วนใหม่
รับชิ้นส่วนs
และโทร
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
ภายในGreeting
, who
จะมีค่าเช่นเดียวs
กับอาร์เรย์พื้นฐานเดียวกัน