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
, who
sẽ có giá trị nil
trong 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 ...T
tham 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 s
và cuộc gọi
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
bên trong Greeting
, who
sẽ có cùng giá trị như s
với cùng một mảng bên dưới.