Bài học theo mô-đun (3/5)
Hàm biến thiên
Hàm biến phân chấp nhận số lượng đối số tùy ý của
cùng loại. Bạn khai báo chúng bằng cách đặt ... trước loại cuối cùng
tham số. Bên trong hàm, tham số là một lát.
Tuyên ngôn
func sum(nums ...int) int {
tot := 0
for _, n := range nums {
tot += n
}
return tot
}
sum() // 0 (nums = []int{})
sum(1) // 1
sum(1, 2, 3, 4) // 10Chỉ tham số cuối mới có thể thay đổi:
func log(prefix string, values ...any) { ... } // ok
// func wrong(...int, suffix string) {} // ERRORETrải một lát
Nếu bạn đã có một lát cắt, bạn có thể chuyển nó sang hàm biến đổi với
...:
nums := []int{1, 2, 3}
sum(nums...) // 6 — espande lo slice nei singoli argomenti"..." đi sau lát cắt. Nếu không có sự lây lan, bạn sẽ nhận được một loại
lỗi: bạn sẽ chuyển []int trong đó hàm mong đợi một chuỗi
của int.
nums là một lát, không phải vùng chứa mới
Bên trong hàm nums có loại []int. Tất cả các lát tiêu chuẩn
hoạt động hoạt động: len(nums), nums[0], range, v.v.
Trường hợp sử dụng cổ điển: fmt.Println
Tất cả các hàm Print* của fmt đều có tính biến đổi:
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)Hãy thử nó
Xác định sum(nums ...int) int trả về tổng của tất cả các đối số.
Hiển thị gợi ý
Bên trong hàm `nums` có kiểu `[]int`.
Giải pháp khả dụng sau 3 lần thử
Gọi hàm tính tổng hiện có bằng cách chuyển các số trong lát cắt với mức chênh lệch `nums...`.
Hiển thị gợi ý
`...` đi SAU tên lát cắt.
Giải pháp khả dụng sau 3 lần thử
Bên trong `func f(args ...string)`, `args` là loại gì?
func f(args ...string) {
_ = args
}Tóm tắt lại
...Tlà tham số LAST = hàm biến thiên; bên trong là[]T.- Được gọi với các giá trị đơn: trình biên dịch tập hợp chúng thành một slice.
- Được gọi với một lát cắt hiện có:
slice...(trải rộng, sử dụng lại lát cắt đó). - Tất cả các hàm
fmt.Print*đều có tính biến đổi. - Chỉ tham số cuối cùng có thể là biến đổi.