Đi các chức năng đa dạng

Các hàm Variadic là các hàm chấp nhận số lượng đối số không giới hạn. Thông thường, chúng được thể hiện dưới dạng

func hello(friends ...string) {
    // ...
}

Rất dễ nhận ra từ 3 dấu chấm....

Chúng tôi có thể gọihello()như thế này:

hello("tony", "mark", "mary", "joe")

hoặc là:

hello("tony")

hoặc với số lượng chuỗi vô hạn.

Một ví dụ từ thư viện chuẩn:append()

appendlà một hàm đa dạng, được định nghĩa là

func append(slice []Type, elems ...Type) []Type

Một cách sử dụng phổ biến là khi loại bỏ một mục tại vị tríitừ một mảnga.

a = append(a[:i], a[i+1:]...)

Dòng này tạo một lát cắt mới bằng cách xóa mục tại vị tríitronga, bằng cách kết hợp các mục từ 0 đến i (không bao gồm) và từ i + 1 đến cuối.

Mục đích của...?

appendchấp nhận một lát cắt làm đối số đầu tiên và không giới hạn số lượng đối số, tất cả đều có một kiểucó thể chuyển nhượngđối với loại phần tử của nó.

Viết

a = append(a[:i], a[i+1:]...)

tương đương với viết

a = append(a[:i], a[i+1], a[i+2], a[i+3], a[i+4]) //and so on, until the end of the slice.

Sử dụnga[i+1:]...về cơ bản là một cú pháp viết tắt, như thông số Go mô tả tronghttps://golang.org/ref/spec#Passing_arguments_to_..._parameters:

Nếu f biến thiên với tham số cuối cùng p thuộc kiểu… T, thì trong f kiểu của p tương đương với kiểu [] T. Nếu f được gọi mà không có đối số thực sự nào cho p, giá trị được truyền cho p là nil. Nếu không, giá trị được truyền là một lát cắt kiểu mới [] T với một mảng cơ bản mới có các phần tử kế tiếp là các đối số thực tế, tất cả các phần tử này phải được gán cho T

Sân chơi


Các hướng dẫn về go khác: