ความหมายของ…อินเทอร์เฟซ {} (dot dot dot interface)


93

ด้านล่างนี้เป็นโค้ด Go ที่ฉันมีคำถาม โดยเฉพาะaฟังก์ชันนี้คืออะไร?

func DPrintf(format string, a ...interface{}) (n int, err error) {
  if Debug > 0 {
    n, err = fmt.Printf(format, a...)
  }
  return
}

มีใครบอกฉันได้ไหมว่าจุดสามจุดอยู่ที่นี่คืออะไร? แล้ว...interface{}ทำยังไง?


33
dotdotdot เรียกว่า Ellipsis
Erikw

คำตอบ:


161

ประเภทพารามิเตอร์นำหน้าด้วยจุดสามจุด ( ... ) เรียกว่าพารามิเตอร์ 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กับอาร์เรย์พื้นฐานเดียวกัน


10

เท่าที่interface{}ระยะมันเป็นอินเทอร์เฟซที่ว่างเปล่า กล่าวอีกนัยหนึ่งคืออินเทอร์เฟซที่ใช้งานโดยตัวแปรทั้งหมดใน Go

นี่เป็นประเภทที่คล้ายคลึงกับjava.lang.ObjectหรือSystem.Objectใน C # แต่จะรวมตัวแปรทุกประเภทในภาษาแทน ดังนั้นจึงช่วยให้คุณส่งผ่านอะไรก็ได้ไปยังวิธีการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.