Ý nghĩa của… interface {} (giao diện dot dot dot)


93

Dưới đây là một đoạn mã cờ vây mà tôi có thắc mắc. Cụ thể, achức năng này có gì?

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

Bất cứ ai có thể cho tôi biết những gì ba dấu chấm ở đây? Và ...interface{}làm gì?


33
Dotdotdot được gọi là Dấu ba chấm.
Erikw

Câu trả lời:


161

Một loại tham số có tiền tố là ba dấu chấm (...) được gọi là một tham số đa dạng . Điều đó có nghĩa là bạn có thể truyền bất kỳ số hoặc đối số nào vào tham số đó (giống như với fmt.Printf()). Hàm sẽ nhận danh sách các đối số cho tham số dưới dạng một lát cắt của kiểu được khai báo cho tham số ( []interface{}trong trường hợp của bạn). Các Go Đặc điểm kỹ thuật quốc gia:

Tham số cuối cùng trong chữ ký hàm có thể có kiểu được bắt đầu bằng .... Một hàm có tham số như vậy được gọi là variadic và có thể được gọi với 0 hoặc nhiều đối số cho tham số đó.

Một tham số:

a ...interface{}

Là, đối với hàm tương đương với:

a []interface{}

Sự khác biệt là cách bạn truyền các đối số cho một hàm như vậy. Nó được thực hiện bằng cách cho từng phần tử của lát cắt riêng biệt hoặc là một lát duy nhất, trong trường hợp đó, bạn sẽ phải thêm giá trị lát cắt bằng ba dấu chấm. Các ví dụ sau sẽ dẫn đến cùng một lệnh gọi:

fmt.Println("First", "Second", "Third")

Sẽ làm tương tự như:

s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)

Điều này cũng được giải thích khá rõ trong Đặc điểm kỹ thuật cờ vây :

Cho hàm và lời gọi

   func Greeting(prefix string, who ...string)
   Greeting("nobody")
   Greeting("hello:", "Joe", "Anna", "Eileen")

trong Greeting, whosẽ có giá trị niltrong lần gọi đầu tiên và []string{"Joe", "Anna", "Eileen"}trong lần thứ hai.

Nếu đối số cuối cùng có thể gán cho một kiểu lát cắt []T, nó có thể được chuyển không thay đổi làm giá trị cho một ...Ttham số nếu đối số được theo sau .... Trong trường hợp này không có lát cắt mới nào được tạo.

Đưa ra lát cắt svà cuộc gọi

   s := []string{"James", "Jasmine"}
   Greeting("goodbye:", s...)

bên trong Greeting, whosẽ có cùng giá trị như svới cùng một mảng bên dưới.


10

Theo như interface{}thuật ngữ, nó là giao diện trống. Nói cách khác, giao diện được thực hiện bởi tất cả các biến trong Go.

Đây là loại tương tự với java.lang.Objecthoặc System.Objecttrong C #, nhưng thay vào đó nó bao gồm mọi loại biến trong ngôn ngữ. Vì vậy, nó cho phép bạn chuyển bất cứ thứ gì vào phương thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.